是否将C#应用程序的引用添加到未使用/clr编译的DLL?
我使用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):是否将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的情
他得到的答案是做一个包装。但这并不是真的必要,因为应用程序可以很好地使用dll;只是添加引用步骤不起作用。此外,包装器代码是否需要对dll的引用,从而引发与以前相同的问题?我真的很喜欢一个答案,不涉及编写包装器。< P>当在C++ DLL上使用pNoCKE时,不需要添加引用。只有在调用另一个DLL中的托管代码时,才需要引用。简单地将C++ DLL放到同一目录中,并将其名称添加到
- 您可以通过命令行选项指示C#编译器(csc.exe)添加链接的资源,但我从未找到通过.csproj文件甚至Visual Studio来实现的方法
- 如果C#-DLL包含WinForms用户控件,并且您希望在设计器中使用它,那么它将无法工作,因为WinForms设计器会将C#-DLL复制到一个临时位置,在该位置加载它,但会忽略链接的资源
- 我不知道如果你把你的C#-DLL放到GAC中它是否有效(是的,C++-DLL也会作为一个资源进入,但我不知道在运行你的C#-DLL时它是否被找到!)
csc.exe ... /linkresource:cpp.dll
希望这能有所帮助 通过执行以下操作解决了类似问题:
csc.exe ... /linkresource:cpp.dll
我使用以下命令行为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忽略除最后一个命令之外的所有命令的错误代码