C# 错误:无法加载文件或程序集';Microsoft.Win32Registry';来自.NET Framework控制台应用程序使用的.NET标准库 问题
这给了我很多问题。我们有.NETFramework4.7.2库,它有一个使用该包的助手类,并且在.NETFramework4.7.2单元测试项目中运行良好。我们最近将该库转换为目标.NET Standard 2.0,现在该类在使用时出现以下错误: 错误:System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Win32.Registry,Version=4.1.1.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。 文件名:“Microsoft.Win32.Registry,版本=4.1.1.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a” 在NetStandardRegistryLib.RegistryUtil..ctor(字符串remoteMachineName) 在C:\src\Microsoft.Win32.Registry IssueRepro\FrameworkRegistry\RegistryEditor\Program.cs中的NetStandardRegistryLib.Program.Main(字符串[]args)处:第21行 当我查看Console项目的输出时,我没有在输出中看到C# 错误:无法加载文件或程序集';Microsoft.Win32Registry';来自.NET Framework控制台应用程序使用的.NET标准库 问题,c#,.net,.net-assembly,.net-standard,.net-framework-version,C#,.net,.net Assembly,.net Standard,.net Framework Version,这给了我很多问题。我们有.NETFramework4.7.2库,它有一个使用该包的助手类,并且在.NETFramework4.7.2单元测试项目中运行良好。我们最近将该库转换为目标.NET Standard 2.0,现在该类在使用时出现以下错误: 错误:System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Win32.Registry,Version=4.1.1.0,Culture=neutral,PublicKeyToken=b03f5f7f
Microsoft.Win32.Registry.dll
使用并加载我的.exe-它似乎会尝试从我的dotnet core安装中解析.dll,但由于它是一个.NET Framework应用程序,因此无法工作
复制
我已经创建了一个回购协议,可以在我的Windows 2010机器上为我复制。你可以在这里找到它:
克隆回购协议,然后打开并构建RegistryEditor
项目
使用Powershell或您最喜欢的编辑器-使用三个必需参数[remoteMachineName][Environment variable name to set][Value to set on the Environment variable]**
**注意,这实际上需要一台可以通过IP地址引用的远程机器。出于某种原因,使用127.0.0.1对我来说不起作用,但我不确定为什么。此实用程序的用例用于访问远程机器环境变量
其他注释
当我创建一个用于单元测试的.NET Framework类库并引用相同的.NET标准库时,包含了
Microsoft.Win32.Registry
包,该实用程序运行正常 在您的回购协议中,如果您查看两个csproj文件,您会发现它们完全不同。NetStandardRegistryLib.csproj是新格式,RegistryEditor.csproj是旧格式
您的问题是,旧式项目不能传递地解决依赖关系。RegistryEditor不会复制其自身依赖项NetStandardRegistryLib的依赖项
至少有两种方法可以解决您的问题:
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>
您的.NET标准类库项目必须使用多目标(例如
netstandard2.0
和net45
)才能正常工作,这非常有趣,我的印象是新的.csproj样式只适用于您的项目将要使用.NET核心或.NET标准的情况。未意识到新格式与.NET Framework兼容。回购只是一个例子,说明我遇到了什么。我会用我真正的项目来做这个-谢谢!另一方面,有没有办法让Visual Studio默认使用新的项目格式,即使是.NET Framework项目?我应用了你的.csproj文件,发现它现在只需一个小改动即可工作-我需要添加Exe,以便它实际生成.Exe,因为它是一个控制台应用程序。很抱歉,我错过了输出类型
。幸运的是,切换到新格式后,VS将允许您通过其UI调整属性。但是我没有找到一种方法使它默认为新的格式。记住在项目变得太复杂之前立即切换。
[assembly: AssemblyTitle("RegistryEditor")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RegistryEditor")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]