Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将C#应用程序的引用添加到未使用/clr编译的DLL?_C#_C++_Visual Studio_Visual Studio 2008_Pinvoke - Fatal编程技术网

是否将C#应用程序的引用添加到未使用/clr编译的DLL?

是否将C#应用程序的引用添加到未使用/clr编译的DLL?,c#,c++,visual-studio,visual-studio-2008,pinvoke,C#,C++,Visual Studio,Visual Studio 2008,Pinvoke,我使用VisualStudio 2008来构建一个解决方案,有两个项目:一个C控制台应用程序和一个C++ DLL。我希望应用程序使用P/Invoke从dll调用函数。因此,我试图添加dll作为对C#app的引用。但是当我尝试addreference命令时,visualstudio不允许我这样做,除非我在dll上设置了/clr属性(在configurationproperties:General下)。现在,我认为P/Invoke可以处理普通的旧win32 DLL。事实上,如果我在不使用/clr的情

我使用VisualStudio 2008来构建一个解决方案,有两个项目:一个C控制台应用程序和一个C++ DLL。我希望应用程序使用P/Invoke从dll调用函数。因此,我试图添加dll作为对C#app的引用。但是当我尝试addreference命令时,visualstudio不允许我这样做,除非我在dll上设置了/clr属性(在configurationproperties:General下)。现在,我认为P/Invoke可以处理普通的旧win32 DLL。事实上,如果我在不使用/clr的情况下构建dll,并手动将其复制到bin/Debug,那么应用程序运行良好。那么为什么需要/clr来添加dll作为引用呢?如果VS不允许我添加它,是否有一些(干净的)解决方法让我的应用程序找到dll

我看到有人在这里遇到了类似的问题(尽管有第三方dll):
他得到的答案是做一个包装。但这并不是真的必要,因为应用程序可以很好地使用dll;只是添加引用步骤不起作用。此外,包装器代码是否需要对dll的引用,从而引发与以前相同的问题?我真的很喜欢一个答案,不涉及编写包装器。

< P>当在C++ DLL上使用pNoCKE时,不需要添加引用。只有在调用另一个DLL中的托管代码时,才需要引用。简单地将C++ DLL放到同一目录中,并将其名称添加到DLimPult属性

为什么不添加一个后生成步骤来将非托管DLL复制到项目目录中?您不需要“引用”就可以引用非托管DLL,而且您遇到的唯一问题似乎是由于文件没有自动复制到搜索路径中。

理论上,您可以将C++-DLL作为链接资源添加到C#-DLL中。这将使.NET将C++DLL复制到任何地方,甚至将C++DLL复制到GAC中。 从理论上讲,这意味着存在一些缺点:

  • 您可以通过命令行选项指示C#编译器(csc.exe)添加链接的资源,但我从未找到通过.csproj文件甚至Visual Studio来实现的方法
  • 如果C#-DLL包含WinForms用户控件,并且您希望在设计器中使用它,那么它将无法工作,因为WinForms设计器会将C#-DLL复制到一个临时位置,在该位置加载它,但会忽略链接的资源
  • 我不知道如果你把你的C#-DLL放到GAC中它是否有效(是的,C++-DLL也会作为一个资源进入,但我不知道在运行你的C#-DLL时它是否被找到!)
因此,如果以上任何一项都不适用,您可以调用csc.exe,如下所示:

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

希望这能有所帮助

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

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

  • 对于生产,每夜msbuild任务将所有内容构建到单个文件夹中,并且标记为“内容/始终复制”的非托管dll-s将自动包含在它们所属的程序集的构建中


  • 我使用以下命令行为C#应用程序编写了一个预构建步骤:copy“$(SolutionDir)Debug\MathDll.dll”“$(TargetDir)”。唉,我希望“添加引用”功能能正常工作,因为现在我必须维护它,我想发布版本会有所不同。。。。我真的不明白为什么“添加引用”不应该处理这种事情。我只是找到了一种稍微干净一点的方法。我没有使用编译前/编译后的DOS命令,而是将dll作为“现有项”添加到C#项目中。然后在其属性下,我将“复制到输出目录”设置为“更新时复制”。(它的“编译操作”是“内容”。)这对我来说似乎仍然有点黑客,但至少它修复了调试与发布的问题,更容易发现。Oops——我意识到我的第二个解决方法并不能解决调试与发布的问题,因为我引用了调试文件夹中的dll。另一方面,第一种解决方法可以通过将命令更改为复制“$(SolutionDir)$(Configuration)\MathDll.dll”“$(TargetDir)”,来处理此问题。@Paul我使用了复制“$(ProjectDir)Resources\*”$(TargetDir)”,因为我将dll放在了我的资源目录中。VS识别的“$…”列表在哪里?请注意在生成后步骤中的每个批处理命令后检查errorlevel,因为MSBuild忽略除最后一个命令之外的所有命令的错误代码