Библиотека классов C# не будет регистрироваться для COM
Я пытаюсь получить доступ к библиотеке классов.NET в Microsoft Excel. Для этого я знаю, что библиотека классов.NET должна быть зарегистрирована в COM. Поэтому я попытался перейти к информации о сборке и установить для параметра COM Visible значение true. Затем на вкладке сборки я установил Register for COM Interop для true. Я проверил файл AssemblyInfo.cs, и он содержит [assembly: ComVisible(true)]
, Но по какой-то причине, когда я пытаюсь добавить ссылку на Class Lib в Excel, пространство имен не появляется в списке. Я сделал быструю проверку библиотеки классов, в которой ничего не было, и сделал то же самое (установил COM Vis = true и Register For COM Interop = true), и он действительно появился в списке доступных ссылок. Я не могу понять, в чем разница между двумя классами. Я не уверен, действительно ли мой класс регистрируется для взаимодействия COM или нет. Кто-нибудь знает, что я могу сделать, чтобы это исправить???
Добавлено: я пытался зарегистрировать класс вручную, используя RegAsm, но я получаю следующее сообщение... "RegAsm : warning RA0000 : No types were registered"
Добавлено: я проверил выходной каталог своего проекта и заметил, что файл библиотеки типов (*.tlb) не создается при сборке проекта. Я убедился, что у каждого класса есть свой атрибут GUID. Проект не содержит никаких структур, интерфейсов или перечислений.
2 ответа
Хорошо, я нашел проблему, которая была вызвана двумя проблемами. Когда я собирал проект в Visual Studio, я заметил, что файл библиотеки типов не создается. Я обнаружил предупреждение, в котором говорилось, что не было найдено классов, которые можно было бы зарегистрировать, поэтому регистрация не проводилась. Пока я копал немного глубже, я нашел эти два правила. 1. Статические классы не будут регистрироваться в COM. 2. Все классы должны иметь открытый конструктор по умолчанию для создания экземпляров через COM
Из MSDN: Типы должны иметь открытый конструктор по умолчанию для создания экземпляра через COM. Управляемые открытые типы видны для COM. Однако без общедоступного конструктора по умолчанию (конструктор без аргументов) COM-клиенты не могут создать экземпляр типа. COM-клиенты могут по-прежнему использовать тип, если тип создается другим способом, а экземпляр возвращается COM-клиенту. Вы можете включить перегруженные конструкторы, которые принимают различные аргументы для этих типов. Однако конструкторы, которые принимают аргументы, могут вызываться только из управляемого (.NET) кода.
Проверьте безопасность для надстроек в Excel. Также убедитесь, что вы записываете все в файл, MS Office имеет тенденцию использовать любые исключения, возникающие при запуске надстройки.