C#如何在构建中包含DLL依赖项? 我有一个VisualC++项目(它构建为一个称为x的DLL),引用另一个DLL(称为Y).< 在我的VisualC++项目中,我通过项目设置、链接器、输入和附加依赖项设置了对y的引用。

C#如何在构建中包含DLL依赖项? 我有一个VisualC++项目(它构建为一个称为x的DLL),引用另一个DLL(称为Y).< 在我的VisualC++项目中,我通过项目设置、链接器、输入和附加依赖项设置了对y的引用。,c#,visual-c++,dll,C#,Visual C++,Dll,现在我有了另一个项目,一个C#项目Z,它引用了X。我通过添加X作为项目依赖项将X包括在Z中 出于某种原因,在编译Z之前需要先编译X(项目不会同时编译所有内容) 但当我运行Z并点击对Z的引用时,我得到一个异常“无法加载文件或程序集“X”或其依赖项之一” 当我查看Z的build文件夹时,我在其中看到了X.dll,但没有看到Y.dll 如何修复此问题?恐怕您需要手动编辑项目文件才能实现此行为。(不幸的是,没有VisualC++项目中的菜单来做这个。)< /P> 我建议在开始编辑项目文件之前进行备份 在

现在我有了另一个项目,一个C#项目Z,它引用了X。我通过添加X作为项目依赖项将X包括在Z中

出于某种原因,在编译Z之前需要先编译X(项目不会同时编译所有内容)

但当我运行Z并点击对Z的引用时,我得到一个异常“无法加载文件或程序集“X”或其依赖项之一”

当我查看Z的build文件夹时,我在其中看到了X.dll,但没有看到Y.dll


如何修复此问题?

恐怕您需要手动编辑项目文件才能实现此行为。(不幸的是,没有VisualC++项目中的菜单来做这个。)< /P> 我建议在开始编辑项目文件之前进行备份

在VisualStudio中,您需要卸载X的项目文件(右键单击并在解决方案资源管理器中选择“卸载项目”)

然后再次右键单击并选择“编辑X.vcxproj”

项目元素中,您需要添加如下项目组:

<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>

Y.dll
保存最新
Yd.dll
保存最新
如果没有其他调试dll文件(或64位和32位版本),则只能使用一个Itemgroup并删除condition属性。然后将Y.dll复制到所有项目输出

然后保存编辑并重新加载项目(同时单击鼠标右键)

这就解决了问题,因为现在,项目“Z”将知道,当它构建项目“X”时,它需要将Y.dll复制到项目“X”的输出中,或者引用“X”的父项目中

(最好使用变量而不是硬编码的路径,但我希望保持示例的简单性。)

< >我在许多托管C++项目中使用这个项目,引用第三方或开源库。我花了一段时间才弄明白


我希望这有帮助

您是否尝试将Y作为依赖项添加到Z?顺便说一下,如果你再向某人解释这个问题,考虑一下C++项目的一组名称和C项目的另一组(你描述的有点难)。当我在Z中,C项目中,我试图给Y添加一个引用,我得到了无法添加,请确保该文件可访问并且是有效的程序集或COM组件。注意:如果我只是将“粘贴Y”复制到我的C#项目的bin文件夹中,项目就可以运行。重建解决方案时有任何警告吗?没有。没有什么什么都没有。C#build系统非常擅长知道何时复制依赖的DLL。但是当Y依赖项是非托管DLL时,它就无能为力了,因为没有元数据表明X需要它。这就是本地代码的苦难。你必须帮助把它放在正确的地方。构建后事件中的XCopy为1,将Y添加到C#项目中为1,将Y存储在路径上的目录中为1,pinvoking SetDllDirectory为1,将所有内容构建到同一目录中可能为1。选择最接近您计划如何部署项目的内容。这就是nuget软件包的用途吗?他们将正确的DLL放在正确的位置,并将相关行添加到项目属性文件中?如果可用,NuGet软件包将为您处理此问题。也可以创建属性表,并将其添加到项目中。在Visual Studio中添加属性页时,属性页的内容将导入到项目文件中。