错误:无法从.NET Framework控制台应用程序消耗的.NET标准库中加载文件或程序集'Microsoft.Win32Registry'

泰勒·尼尔森(Tyler Nielsen)

问题

Microsoft.Win32.Registry NuGet包是给了我很多的问题。我们拥有.NET Framework 4.7.2库,该库具有使用该软件包的帮助程序类,并且在.NET Framework 4.7.2单元测试项目中运行良好。我们最近将库转换为目标.NET Standard 2.0,现在,当使用以下错误时,此类中断。

错误:System.IO.FileNotFoundException:无法加载文件或程序集'Microsoft.Win32.Registry,版本= 4.1.1.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。该系统找不到指定的文件。文件名:C的NetStandardRegistryLib.Program.Main(String [] args)的NetStandardRegistryLib.RegistryUtil..ctor(String remoteMachineName)的文件名:'Microsoft.Win32.Registry,Version = 4.1.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a': \ src \ Microsoft.Win32.Registry-IssueRepro \ FrameworkRegistry \ RegistryEditor \ Program.cs:line 21

当我查看Console项目的输出时,在输出中没有看到Microsoft.Win32.Registry.dll

使用ILSpy并加载我的.exe-似乎它将尝试从我的dotnet核心安装中解析.dll,由于它是.NET Framework应用程序,因此无法正常工作。

重现

我创建了一个可在我的Windows 2010计算机上复制的存储库。您可以在这里找到它:https : //github.com/TylerNielsen/Microsoft.Win32.Registry-IssueRepro

克隆仓库,然后打开并构建RegistryEditor项目。

使用Powershell或您喜欢的编辑器-使用三个必需的参数调用该工具[remoteMachineName] [要设置的环境变量名称] [要在环境变量上设置的值] **

**注意,这实际上需要一台可以通过IP地址引用的远程计算机。由于某种原因,使用127.0.0.1对我不起作用,但是我不确定为什么。该实用程序的用例用于访问远程机器环境变量。

其他注意事项

当我创建一个用于单元测试的.NET Framework类库并引用相同的.NET标准库时-Microsoft.Win32.Registry包含包,该实用程序运行得很好。

迈克尔·多马申科

在您的存储库中,如果您查看两个csproj文件,您会发现它们完全不同。NetStandardRegistryLib.csproj是新格式,RegistryEditor.csproj是旧格式。

您的问题是旧式项目无法暂时解决依赖关系。RegistryEditor将不会复制其自己的依赖项NetStandardRegistryLib的依赖项。

至少有两种方法可以解决您的问题:

  1. 只需将Microsoft.Win32.Registry Nuget包显式添加到RegistryEditor项目。这将使Microsoft.Win32.Registry.dll出现在RegistryEditor构建文件夹中。

  2. 将RegistryEditor.csproj转换为新格式。它不限于netstandard版本,您也可以将其用于定位.Net Framework版本的版本。而且它确实可以暂时解决依赖关系!

这是有关如何进行一般转换的长指南https://natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/

由于您的项目非常简单,因此我为您进行了转换。只需用下面的代码替换RegistryEditor.csproj的内容。它仍然是针对性的net472

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
    <AssemblyName>RegistryEditor</AssemblyName>
    <RootNamespace>RegistryEditor</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\NetStandardRegistryLib\NetStandardRegistryLib.csproj" />
  </ItemGroup>
</Project>

请注意,csproj文件属性现在提供了一些以前在AssemblyInfo.cs文件中的属性,因此您需要从AssemblyInfo.cs中删除它们以修复编译错误:

[assembly: AssemblyTitle("RegistryEditor")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RegistryEditor")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章