Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误:无法加载文件或程序集';Microsoft.Win32Registry';来自.NET Framework控制台应用程序使用的.NET标准库 问题_C#_.net_.net Assembly_.net Standard_.net Framework Version - Fatal编程技术网

C# 错误:无法加载文件或程序集';Microsoft.Win32Registry';来自.NET Framework控制台应用程序使用的.NET标准库 问题

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

这给了我很多问题。我们有.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项目的输出时,我没有在输出中看到
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的依赖项

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

  • 只需将Microsoft.Win32.Registry Nuget包显式添加到RegistryEditor项目。这将使Microsoft.Win32.Registry.dll显示在RegistryEditor生成文件夹中

  • 将RegistryEditor.csproj转换为新格式。它不仅限于netstandard版本,还可以用于针对.Net Framework版本的版本。它确实可以通过传递方式解决依赖关系

  • 这里有一个关于如何进行转换的长指南

    由于您的项目非常简单,我已为您转换了它。只需用下面的代码替换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>
    

    您的.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")]