这个问题来自我之前的问题:Create DLL from unmanaged C++,但你不必阅读它来理解这个新问题。
我现在有一个包含非托管C ++代码的DLL,其中包含一些函数,我只导出一个供外部使用。接下来,我需要在托管C ++项目中使用此DLL(使用公共语言运行时支持构建)。到目前为止,我通过在Visual Studio 2010中设置Additional Include Directories
添加了对现有非托管项目头文件的引用。
如果我现在尝试添加对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并将其复制到与我相同的文件夹中托管C ++的可执行文件,一切正常。
我不确定这是否是正确的方法,因为它似乎是一个hackish解决方案。此外,这意味着每次我更改源代码时都必须复制DLL。
总结我的问题:
MyUnmanagedDLL.dll
。我还为这个DLL创建了一个头文件。MyManagedProject.vxproj
MyUnmanagedDLL.dll
中使用MyManagedProject.vxproj
?有没有正确的方法来引用它,或者我应该将它复制到与MyManagedProject.exe
相同的目录中? (这有效,但我不确定它的良好做法......)额外信息:Windows 7,Visual Studio 2010 Ultimate,CMake 2.8.10.2
答案 0 :(得分:8)
您无法将非托管DLL添加为托管C ++项目的引用。您只能使用托管DLL执行此操作。你所做的是链接到非托管DLL,就像链接到非托管C ++项目中的非托管DLL一样:
答案 1 :(得分:1)
显然,唯一的解决方案是在用DllImport属性修饰的方法中传递非托管dll路径。
你可以做些什么来保持整洁的方式是创建一个lib文件夹来放置非托管的dll并将它们的属性''复制到输出目录''标记为''始终复制''(右键单击unmanaged dll->属性 - >复制到输出目录:始终复制)。
在方法DllImport属性中,必须将参数指定为“lib / unmanaged.dll”。在C#中,你会有这样的东西。
[DllImport("lib/testLib.dll")]
private static extern int DisplayHelloFromDLL();
这种方法与之前的答案没有区别,但它可以帮助您保持代码更加整洁。