Проблема экспорта / импорта DLL в Visual Studio 2010 - PullRequest
1 голос
/ 12 июля 2010

Я написал визуальное консольное приложение на C ++ win32, написал и протестировал его в

win32 консольном проекте

затем я переключаюсь на

win32 project

, импортирую все исходные файлы и создаю для него dll.пометить класс, который я хочу экспортировать как

#define DllExport   __declspec( dllexport )

class DllExport theClass {
} 

, это работает, и dll генерируется.Затем я создал еще один проект C # и хочу добавить DLL в проект.по ссылке-> добавить ссылку-> браузер.Затем я выбираю эту DLL.тогда это дает мне ошибку

ссылка на '' '' '' '.dll не может быть добавлена.Пожалуйста, убедитесь, что файл доступен, и это действительный компонент сборки или ком.

Кто-нибудь знает, где я сделал неправильно для создания / импорта DLL?*

1 Ответ

5 голосов
/ 12 июля 2010

Диалоговое окно «Добавить ссылку» может работать только для библиотек DLL, которые содержат метаданные (управляемый код) или библиотеки типов (сервер COM).Ваша DLL не соответствует этому счету, вы можете использовать только атрибут [DllImport] в коде C #, чтобы использовать маршаллер P / Invoke для вызова неуправляемой точки входа DLL.

Это может , а не будь нативный класс C ++, как вы пытаетесь это сделать, у управляемого кода нет надежного механизма для выделения неуправляемой памяти и вызова конструктора (и деструктора) нативного класса C ++.Если не считать сложности поиска кода конструктора и деструктора, маршаллеру P / Invoke нет способа узнать размер объекта.Язык C ++ не генерирует метаданные, необходимые для того, чтобы знать эту необходимую информацию.

Если вы хотите использовать P / Invoke, тогда напишите простую глобальную функцию, украшенную extern "C", __declspec (dllexport) и(необязательно) __stdcall.

Если вы хотите экспортировать класс C ++, тогда единственным способом является использование языка C ++ / CLI и создание оболочки «ref class» для собственного класса C ++.

ИлиВы могли бы написать COM класс, универсальный клей в Windows.Очень хорошо поддерживается .NET, вероятно, это не то, что вам нужно, если вы никогда раньше не писали COM-код.ATL - лучший способ начать работу.

...