Visual Studio 2010 — Ссылка на неуправляемую DLL C ++ из Managed Stack Overflow

Этот вопрос следует из моего предыдущего вопроса: Создать DLL из неуправляемого C ++, но вам не придется читать его, чтобы понять этот новый вопрос.

Теперь у меня есть DLL, которая содержит неуправляемый код C ++, состоящий из нескольких функций, из которых я экспортирую только одну для внешнего использования. Далее мне нужно использовать эту DLL в проекте Managed C ++ (создан с поддержкой Common Language Runtime). До сих пор я добавил ссылку на заголовочный файл существующего неуправляемого проекта, установив Additional Include Directories в Visual Studio 2010.

Если я сейчас попытаюсь добавить ссылку на файл DLL: MyManagedProject > Properties > Common Properties > Add New Reference > Browse > MyUnmanagedDLL.dllЯ получаю ошибку Could not add a reference to file MyUnmanagedDLL.dll because it is neither a .NET assembly nor a registered ActiveX control. Однако, если я возьму ранее упомянутую DLL и скопирую ее в ту же папку, что и исполняемый файл моего Managed C ++, все работает нормально.

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

Подводя итог моей проблемы:

  1. Я создал DLL, состоящую из неуправляемого кода C ++, давайте назовем это MyUnmanagedDLL.dll, Я также создал заголовочный файл для этой DLL.
  2. У меня есть проект Managed C ++ (CLR), давайте назовем его MyManagedProject.vxproj
  3. Как я могу использовать MyUnmanagedDLL.dll в MyManagedProject.vxproj? Есть ли правильный способ ссылки на него, или я должен просто скопировать его в тот же каталог, что и MyManagedProject.exe? (Это работает, но я не уверен, что это хорошая практика …)

Дополнительная информация: Windows 7, Visual Studio 2010 Ultimate, CMake 2.8.10.2

2

Решение

Вы не можете добавить неуправляемую DLL в качестве ссылки на ваш управляемый проект C ++. Вы можете сделать это только с управляемыми DLL. Вместо этого вы ссылаетесь на неуправляемую DLL точно так же, как вы ссылаетесь на неуправляемую DLL в неуправляемом проекте C ++:

  • Используйте заголовочный файл для компиляции.
  • Предоставить компоновщику файл .lib неуправляемой библиотеки DLL, например, добавив его в список Дополнительные зависимости список на страницах настройки компоновщика.
  • Поместите DLL в тот же каталог, что и исполняемый файл, чтобы он мог быть найден загрузчиком.
8

Другие решения

По-видимому, единственное решение — передать неуправляемый путь DLL в методе, украшенном атрибутом DllImport.

То, что вы можете сделать, чтобы все было аккуратно, — это создать папку lib для размещения неуправляемых dll и пометить их свойство » Copy to output directory » как » Copy Always » (щелкните правой кнопкой мыши по неуправляемому dll- > Свойства-> Копировать в выходной каталог: Копировать всегда).

В атрибуте DllImport вашего метода вы должны указать параметры как «lib / unmanaged.dll». В C # у вас будет что-то вроде этого.

[DllImport("lib/testLib.dll")]
private static extern int DisplayHelloFromDLL();

Этот подход не отличается от предыдущих ответов, но он поможет вам сделать код немного более аккуратным.

1