Неможливо створити бібліотечний файл типу згенерований DLL з Visual Studio 2010, але можна зі скомпільованим командним рядком

У мене є файл TestClass.cs, який містить інтерфейс, і клас, дуже подібний до цього:

namespace CPierce.CSharpBridge
{
    [System.Runtime.InteropServices.Guid("3D08DF02-EFBA-4A65-AD84-B08ADEADBEEF")]
    public interface ICSide
    {
       //interface definition omitted...
    }
    [System.Runtime.InteropServices.Guid("CBC04D81-398B-4B03-A3D1-C6D5DEADBEEF")]
    public partial class CSide : ICSide
    {
       //class definition omitted...
    }
}

Коли я скомпілю це в командному рядку і запускаю його на русі:

csc /debug /t:library TestClass.cs 
regasm TestClass.dll /tlb:TestClass.tlb

Я отримую хороший, великий .tlb файл, придатний для включення в проект C ++ в іншому місці ....

 10/27/2011  01:50 PM             3,616 TestClass.tlb

Коли я поклав TestClass.cs на "Class Project" у Visual Studio, скомпілюйте його, запустіть regasm, отриманий .tlb є жалюгідним і практично марним - він не має інтерфейсу, ніяких підписів методів тощо.

[Compiled TestClass.cs as part of Project "ClassProject" in Visual Studio]
regasm ClassProject.dll /tlb:ClassProject.dll

10/27/2011  01:58 PM             1,132 ClassProject.tlb

This is the same C# code in both cases, one being compiled with Visual Studio one at the command line, giving me completely different results.

Що дає?

-

Оновлення: Ганс пропонує, що відсутній атрибут [ComVisible (true)] викликає проблему. Спробував, і це спрацювало. Але це ще не відповідає на запитання: чому ? Чому я отримую різні результати, на основі яких я використовую метод компіляції?

3
Ви забули атрибут [ComVisible (true)].
додано Автор Hans Passant, джерело
додано Автор Hans Passant, джерело
Я думаю, в IDE варіант "Зробити збірку COM-Visible".
додано Автор Hans Passant, джерело
Правильно ... але чому це впливає тільки на компіляцію Visual Studio, а не на версію командного рядка?
додано Автор Clinton Pierce, джерело

2 Відповіді

Якщо ви створюєте нову бібліотеку класів в Visual Studio, файл за замовчуванням AssemblyInfo.cs містить рядок:

[assembly: ComVisible(false)]

Команда командного рядка, яку ви використовуєте, складається тільки з файлу TestClass.cs, тому ви отримуєте стандартний параметр для ComVisible (який, судячи з наявних даних, ймовірно, є true ). Під час копіювання з IDE ви також включаєте AssemblyInfo.cs, тому його явне налаштування замінює за замовчуванням компілятор.

2
додано

Також перевірте, чи в вашому класі є функції доступу типу загальнодоступні .

У нашому випадку проект працював нормально, коли він використовувався в рамках рішення, але коли ми вилучили логіку для створення DLL , він припинив створювати файл TLB з немає посилань на чому ...

Отже, якщо у вас є такий клас,

public class tlbuser{    
    private void functionTLB(){
        //function code
    }
   //rest of the class code
}

Переконайтеся, що він змінено на:

public class tlbuser{    
    public void functionTLB(){
        //function code
    }
   //rest of the class code
}
0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug