我在为我的 C++/CLI Visual Studio 项目创建 Nuget 包时遇到问题。
我有一个 .Net6 C# 程序集 MyNet6Lib,它引用了我的 C++/CLI dll MyClrLib.dll,它也是针对 .Net6 构建的。这实际上是一些 C++ 类的 C# 包装器。 当我将我的 C++/CLI 库打包到 Nuget 包中,并安装到 C# 程序集中时,出现运行时错误
System.IO.FileNotFoundException: '无法加载文件或程序集 'MyClrLib,版本=1.0.1.0,文化=中性,PublicKeyToken=null'。这 系统找不到指定的文件。'
当我从 C# 项目直接引用 C++/CLI 项目时,C++/CLI 库运行良好,但从我的 Nuget 包安装时却没有。
C# 项目针对 dll 构建良好,但在运行时失败。
我的 MyNet6Lib 和 MyClrLib 的 nuspec 文件如下。
Net6Lib.nuspec
<?xml version="1.0"?>
<package >
<metadata>
<id>MyNet6Lib</id>
<version>1.0.2</version>
<title>MyNet6Lib</title>
<authors>Me</authors>
<description>My NET6 Lib.</description>
<releaseNotes>First release</releaseNotes>
<copyright>Copyright 2022</copyright>
</metadata>
<files>
<file src=".\bin\x86\$configuration$\net6.0\MyNet6Lib.dll" target="lib\netcoreapp6.0\MyNet6Lib.dll"/>
</files>
</package>
MyClrLib.nuspec
<?xml version="1.0"?>
<package >
<metadata>
<id>MyClrLib</id>
<version>1.0.2</version>
<title>MyClrLib</title>
<authors>Me</authors>
<description>My CLR Lib.</description>
<releaseNotes>First release</releaseNotes>
<copyright>Copyright 2022</copyright>
</metadata>
<files>
<file src="..\$configuration$\MyClrLib.dll" target="lib\netcoreapp6.0\MyClrLib.dll"/>
</files>
</package>
我在构建 .Net4.8 时没有遇到这个问题,但是最近移植到 .Net6。直接项目引用工作但不是从 Nuget 包安装似乎很奇怪,因为相同的 dll 被复制到构建位置。
有很多关于为 .Net 程序集创建 Nuget 包的信息,但我在 C++/CLI 项目上找不到任何信息。项目属性中没有“包”选项卡。
如果有人能帮助我解决这个问题,或者指出我在哪里进行调查,我将不胜感激。
谢谢。
问题已通过包含文件 Ijwhost.dll 得到解决。这是 c++/cli 库在构建为 .Net6 时运行所必需的。
我意识到这不是特定的 Nuget 包问题,而是与 .Net6 C++/CLI 项目部署相关的问题。
然而,其他人可能会遇到同样的问题,因此认为该帖子很有用。
复制 ijwhost.dll 所需的代码应该放在您的项目文件中
<temGroup>
<Content Include="$(NetCoreTargetingPackRoot)\Microsoft.NETCore.App.Host.$(NETCoreSdkRuntimeIdentifier)\$(BundledNETCoreAppPackageVersion)\runtimes\$(NETCoreSdkRuntimeIdentifier)\native\ijwhost.dll" Link="ijwhost.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
来源:https://github.com/AmpScm/SharpProj/issues/25#issuecomment-1482915538