从C#应用程序添加一个引用到没有/ clr编译的DLL?

时间:2010-01-18 17:18:46

标签: c# c++ visual-studio visual-studio-2008 pinvoke

我正在使用Visual Studio 2008构建一个包含两个项目的解决方案:C#控制台应用程序和C ++ DLL。我希望应用程序使用P / Invoke从dll调用函数。因此,我正在尝试将dll添加为C#应用程序的参考。但是当我尝试添加引用命令时,Visual Studio将不允许我这样做,除非我在dll上设置/ clr属性(在Configuration Properties:General下)。现在,我认为P / Invoke可以处理普通的win32 dll。实际上,如果我在没有/ clr的情况下构建我的dll并且只是手动将它复制到bin / Debug,那么应用程序运行正常。那么为什么/ clr需要添加dll作为参考?如果VS不允许我添加它,是否有一些(干净的)解决方法以便我的应用找到dll?

我看到有人在这里有类似的问题(虽然有第三方dll): Unable to add a DLL Reference to VS 2008他得到的答案是建立一个包装器。但这并不是必需的,因为应用程序可以使用dll就好了;它只是添加引用步骤不起作用。此外,包装器代码是否需要引用dll,引发与以前相同的问题?我真的很喜欢一个不涉及编写包装器的答案。

4 个答案:

答案 0 :(得分:7)

为什么不添加一个构建后步骤来将非托管DLL复制到项目目录中?您不需要“引用”来引用非托管DLL,这听起来像您遇到的唯一问题是由于文件没有自动复制到搜索路径中。

答案 1 :(得分:6)

在C ++ DLL上使用PInvoke时,无需添加引用。只有在另一个DLL中调用托管代码时才需要引用。只需将C ++ DLL放在同一目录中,并将其名称添加到DllImport属性

即可

答案 2 :(得分:0)

理论上,您可以将C ++ - DLL作为链接资源添加到C#-DLL中。这将使.NET复制您的C ++ - DLL,无论它将C#-DLL复制到GAC中。 从理论上讲,存在一些缺点:

  • 您可以通过命令行选项指示C#编译器(csc.exe)添加链接资源但我从未找到过通过.csproj文件甚至Visual Studio
  • 的方法。
  • 如果C#-DLL包含WinForms用户控件并且您想在设计器中使用它,它将无法工作,因为Winforms-Designer将C#-DLL复制到它加载它的临时位置,但它忽略了链接的资源。 / LI>
  • 如果您将C#-DLL放入GAC,我不知道它是否有效(是的,C ++ - DLL也会作为资源使用,但我不知道在运行C#时是否找到它 - DLL!)

因此,如果以上都不适合您,您可以调用以下csc.exe:

csc.exe ... /linkresource:cpp.dll

希望这可能有所帮助!

答案 3 :(得分:0)

通过执行以下操作解决了类似问题:

  1. 在所有开发机器上,将相关dll-s的路径添加到PATH环境变量中。这样,所有开发人员都可以调试所有可以使用非托管dll-s引用程序集的可执行文件,而无需为每个可执行文件编写后期构建脚本。

  2. 对于生产,每晚msbuild任务将所有内容构建到单个文件夹中,标记为“内容/始终复制”的非托管dll-s会自动包含在那个组件的构建中,它们是它们的一部分的。