Этот вопрос следует из моего предыдущего вопроса: Создать 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 каждый раз, когда я изменяю ее исходный код.
Подводя итог моей проблемы:
MyUnmanagedDLL.dll
, Я также создал заголовочный файл для этой DLL.MyManagedProject.vxproj
MyUnmanagedDLL.dll
в MyManagedProject.vxproj
? Есть ли правильный способ ссылки на него, или я должен просто скопировать его в тот же каталог, что и MyManagedProject.exe
? (Это работает, но я не уверен, что это хорошая практика …)Дополнительная информация: Windows 7, Visual Studio 2010 Ultimate, CMake 2.8.10.2
Вы не можете добавить неуправляемую DLL в качестве ссылки на ваш управляемый проект C ++. Вы можете сделать это только с управляемыми DLL. Вместо этого вы ссылаетесь на неуправляемую DLL точно так же, как вы ссылаетесь на неуправляемую DLL в неуправляемом проекте C ++:
По-видимому, единственное решение — передать неуправляемый путь 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();
Этот подход не отличается от предыдущих ответов, но он поможет вам сделать код немного более аккуратным.