Как использовать неуправляемый класс из управляемой DLL в .NET?

У меня есть неуправляемый класс, который я пытаюсь dllexport из управляемого файла DLL. Я пытаюсь использовать неуправляемый класс в другом управляемом файле DLL. Однако, когда я пытаюсь сделать это, я получаю ошибки ссылки .

Я делал это много раз с неуправляемыми файлами DLL, поэтому я знаю, как это работает. Я знаю, как использовать "public ref" и т. Д. В управляемых классах.

Есть ли где-нибудь флаг, который мне нужно установить? Или я должен сделать магию DllImport?

Это на .NET 2.0 и Visual Studio 2005 .

23.03.2009 16:09:05
3 ОТВЕТА
РЕШЕНИЕ

Вам необходимо использовать сборку взаимодействия для неуправляемых библиотек или компонентов COM. Вот ссылка с хорошей информацией об этом.

1
23.03.2009 16:19:37
Похоже, я должен использовать PInvoke по этой ссылке. Как больно. Я не могу просто использовать dllimport, как с обычной неуправляемой DLL.
Nick 23.03.2009 16:40:16

Если это файл COM DLL, то вы можете использовать совместимость COM .NET. Вопрос переполнения стека Есть ли лучший способ для доступа к собственным функциям COM C ++ для взаимодействия из C #? это еще один вопрос, который отвечает на это.

0
23.05.2017 11:48:38
@Nick - управляемые библиотеки DLL можно использовать в качестве компонентов COM, если в Visual Studio включена опция регистрации их с помощью COM.
bbosak 29.12.2011 20:14:05

Если вы хотите использовать неуправляемый класс из управляемого кода, вы можете:

  1. Используйте несколько неприятных P / Invoke для загрузки функций-членов класса (конструктор, деструктор и т. Д.) И создайте более неприятный управляемый класс-обертку для вызова «настоящих» функций-членов. Это становится еще хуже, когда задействованы виртуальные методы.
  2. Второй вариант (который, на мой взгляд, лучше) - это написать класс-оболочку C ++ / CLI (вы упомянули, что вы знакомы с этим), который является простым прокси для неуправляемого класса. Для каждой функции-члена, которую вы используете в неуправляемом классе, у вас будет аналогичная функция в вашем прокси-классе. Тогда это простой случай добавления ссылки на эту DLL из вашего управляемого проекта, и вы сможете использовать свой класс как любой другой класс .NET. Примите во внимание, что вы столкнетесь с большим количеством работы, если ваш класс обнаружит другие неуправляемые вещи (те, которые не могут быть собраны).

Если вам нужна дополнительная информация по второму варианту, я мог бы найти несколько старых ссылок, которые более подробно объясняют эту технику.

3
6.01.2014 19:25:56
Спасибо за ответ. Я стараюсь избегать написания обертки, потому что хочу очень быстро читать большие объемы данных небольшими порциями, и если я остаюсь неуправляемым, я знаю, какова нагрузка на память. Но тоже не хочу использовать PInvoke! :(
Nick 23.03.2009 17:37:16
если это так, то вы можете рассмотреть другой дизайн. возможно какая-то буферизация. или, возможно, переместить некоторую логику из вашего управляемого кода в неуправляемую, чтобы уменьшить количество обращений к неуправляемому коду.
Idan K 23.03.2009 18:07:21