Visual Studio:C++\CLI 包装器程序集路径依赖问题
Posted
技术标签:
【中文标题】Visual Studio:C++\\CLI 包装器程序集路径依赖问题【英文标题】:Visual Studio: C++\CLI wrapper assembly path dependency problemsVisual Studio:C++\CLI 包装器程序集路径依赖问题 【发布时间】:2018-01-15 15:43:38 【问题描述】:大家好,剧情如下:
我有一个包含一些设备函数的小型 C# 库项目:DeviceLib.dll
为了在 C++ 中使用这个函数,我使用 CLI 创建了一个包装器项目:DeviceLibWrapper.dll
最后,我使用了一个小型 C++ 控制台应用程序来测试包装的东西。 一切都按我的预期工作。
为了将 dll 与控制台应用程序分开,我创建了一个文件夹 (c:\test_lib),其中包含所需的所有 dll,并将路径添加到系统“Path”变量中。
我更改了包装器项目的配置以使用路径变量,如果将 DeviceLibWrapper.dll 移动到库文件夹中,它就像一个魅力。
如果我尝试将 C# 库 (DeviceLib.dll) 移动到该文件夹,我只会得到 System.IO.FileNotFoundException(未找到 DeviceLib.dll 程序集)。
首先我在包装项目中使用了对 C# 库的项目引用。
然后我尝试了#using "DeviceLib.dll" 指令并使用 $(Path) 更改了 "Resolve #using References" 选项。 至少我添加了 C# dll 作为完整路径的引用。
但结果还是一样。 如果我将 C# lib 复制到控制台输出文件夹中,则应用程序可以正常工作,否则会引发未找到程序集错误。 所以现在我有点困惑。
解决此类依赖关系的最佳/推荐方法是什么?感谢您的帮助!
【问题讨论】:
【参考方案1】:您可以在 app.config 文件中指定code base or probing path。
代码库:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<codeBase version="2.0.0.0"
href="c:\test_lib\devicelib.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
探测:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="c:\test_lib"/>
</assemblyBinding>
</runtime>
</configuration>
关于这个主题的一个很好的阅读是关于运行时如何定位程序集的文档:
https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies
【讨论】:
以上是关于Visual Studio:C++\CLI 包装器程序集路径依赖问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 2013 中调试不同解决方案中的多个项目
Python 和 Visual Studio 需要安装 Node.js 模块(Superfeedr Node.js 包装器)
如何通过 Visual Studio COM 包装器(或其他方式)在 C# 中使用 C++ 属性联合
使用平台工具集 v120 (Visual Studio 2013) 在 Visual Studio 2015 中创建 C++/CLI 项目