我有一个可视的c ++项目(该项目构建到名为X的DLL),该项目引用了另一个DLL(称为Y)。
在X的可视C ++项目中,我通过项目设置,链接器,输入和其他依赖项设置了对Y的引用。
现在我有另一个项目,一个引用X的C#项目Z。我通过将X添加为项目依赖项将X包含在Z中。
出于某种原因,我需要先编译X,然后才能编译Z(该项目不会同时构建所有内容)。
但是当我运行Z并点击Z的引用时,出现一个异常“无法加载文件或程序集'X'或其依赖项之一”。
当我查看Z的build文件夹时,在那里看到X.dll,但是没有看到Y.dll。
我该如何解决?
答案 0 :(得分:0)
恐怕您需要手动编辑项目文件才能实现此行为。 (不幸的是,Visual C ++项目内部没有菜单可以执行此操作。)
我建议先备份,然后再开始编辑项目文件。
在Visual Studio中,您需要卸载X的项目文件(右键单击并在解决方案资源管理器中选择“卸载项目”)。
然后再次右键单击并选择“编辑X.vcxproj”。
在 Project 元素内,您需要添加一个这样的ItemGroup:
<ItemGroup Condition="'$(Configuration)'=='Release'">
<Content Include="E:\full_path\Y.dll">
<Link>Y.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)'=='Debug'">
<Content Include="E:\full_path\Yd.dll">
<Link>Yd.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
如果没有其他调试dll文件(或64位和32位版本),则只能使用一个Itemgroup并删除condition属性。然后它将Y.dll复制到所有项目输出。
然后保存您的编辑并重新加载项目(也单击鼠标右键)。
这解决了问题,因为现在项目“ Z”将知道在构建项目“ X”时,需要复制Y.dll 到项目“ X”的输出,或者引用“ X”的父项目。
(使用变量而不是硬编码路径会更好,但我想使示例保持简单。)
我在许多引用第三方或开放源代码库的托管C ++项目中使用此功能。我花了一些时间才弄清楚这一点。
我希望这会有所帮助!