.NET项目自动复制VC++生成的动态库

如果要在.NET的项目中使用同一个解决方案中的Visual C++动态链接库项目中的函数,则需要将Visual C++项目中生成的.dll文件复制到.NET项目的输出路径中,否则.NET程序运行时将无法加载所需的.dll文件。

使用“添加引用”功能在.NET项目中添加对Visual C++项目的引用是没有用的。MSBuild并不会把.dll文件复制到.NET项目的输出目录。

可以考虑将相关的.dll文件添加到.NET的项目中。但是,不同配置(Debug、Release)和平台(x86、x64)下要使用的.dll文件并不相同,所以我们需要直接修改MSBuild文件(.csproj或者.vbproj文件)来自动根据当前的配置和平台包含所需的.dll文件。通过MSBuild文件中的Choose元素(参见Choose元素(MSBuild)),可以实现不同条件下包含不同的文件。

在Visual Studio中,右键单击.NET项目的名称,点击“卸载项目”之后,再次右键单击并点击“编辑xxx.csproj”,即可使用文本编辑器直接更改该项目的MSBuild文件的内容。

默认情况下,Visual C++项目win32配置的输出文件位于解决方案目录下的$(Configuration),x64配置的输出文件位于解决方案目录下的$(Platform)\$(Configuration)。对应的.NET项目中的Choose元素的写法如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  ...
  <Choose>
    <When Condition="'$(Platform)' == 'x86'">
      <ItemGroup>
        <Content Include="..\$(Configuration)\*.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    </When>
    <Otherwise>
      <ItemGroup>
        <Content Include="..\$(Platform)\$(Configuration)\*.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    </Otherwise>
  </Choose>
  ...
</Project>

如果修改了默认路径,请相应调整..\$(Configuration)*.dll这一项和..\$(Platform)\$(Configuration)*.dll这一项的值。

如果还需要对文件进行调试(参见在C#中调用和调试C++代码),可以将相应的pdb文件也包含到项目中:

    ...
      <ItemGroup>
        <Content Include="..\$(Configuration)\*.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
        <Content Include="..\$(Configuration)\*.pdb">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    ...
      <ItemGroup>
        <Content Include="..\$(Platform)\$(Configuration)\*.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
        <Content Include="..\$(Platform)\$(Configuration)\*.pdb">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    ...

将.dll文件包含到.NET项目中之后,还需要配置“生成依赖项”,以确保生成.NET项目前自动生成相应的Visual C++项目。在Visual Studio中右键单击.NET项目,点击生成依赖项-项目依赖项,勾选Visual C++项目。这样,生成.NET项目之前,Visual Studio会确认其依赖的Visual C++处于最新状态,并自动进行必要的生成。(该修改会作用于解决方案的.sln文件中,对项目的.csproj/.vbproj文件没有影响。

经过上述两项工作之后,在.NET项目上使用“生成项目”功能时,MSBuild就会自动生成其依赖的Visual C++项目并将生成的.dll(或者还有.pdb)文件复制到.NET项目的输出目录中。

留言

有想法?请给我们留言!您的留言不会直接显示在网站内。