从Managed C ++引用非托管C ++ DLL

时间:2013-01-24 08:23:43

标签: c++ visual-studio-2010 dll clr unmanaged

这个问题来自我之前的问题: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。

总结我的问题:

  1. 我创建了一个由非托管C ++代码组成的DLL,我们称之为MyUnmanagedDLL.dll。我还为这个DLL创建了一个头文件。
  2. 我有一个托管C ++项目(CLR),我们称之为MyManagedProject.vxproj
  3. 如何在MyUnmanagedDLL.dll中使用MyManagedProject.vxproj?有没有正确的方法来引用它,或者我应该将它复制到与MyManagedProject.exe相同的目录中? (这有效,但我不确定它的良好做法......)
  4. 额外信息:Windows 7,Visual Studio 2010 Ultimate,CMake 2.8.10.2

2 个答案:

答案 0 :(得分:8)

您无法将非托管DLL添加为托管C ++项目的引用。您只能使用托管DLL执行此操作。你所做的是链接到非托管DLL,就像链接到非托管C ++项目中的非托管DLL一样:

  • 使用头文件进行编译。
  • 将非托管DLL的.lib文件提供给链接器,例如将其添加到链接器配置页中的 Additional Dependencies 列表中。
  • 将DLL放在与可执行文件相同的目录中,以便可以通过加载程序找到它。

答案 1 :(得分:1)

显然,唯一的解决方案是在用DllImport属性修饰的方法中传递非托管dll路径。

你可以做些什么来保持整洁的方式是创建一个lib文件夹来放置非托管的dll并将它们的属性''复制到输出目录''标记为''始终复制''(右键单击unmanaged dll->属性 - >复制到输出目录:始终复制)。

在方法DllImport属性中,必须将参数指定为“lib / unmanaged.dll”。在C#中,你会有这样的东西。

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

这种方法与之前的答案没有区别,但它可以帮助您保持代码更加整洁。