我有一个VS2017项目,它编译成DLL,然后由其他人编写的EXE调用.这两个项目的目标都是.Net框架4.6.2.我重写了一个DLL方法来返回元组,还导入了相关的NuGet包.当我编译这个项目时,它包含了一个系统.ValueTuple.输出目录中的dll,然后将其部署到其他机器上,在这些机器上,我的dll被EXE加载并调用.但当EXE试图调用返回元组的方法时,它会崩溃:

意外错误无法加载文件或程序集的系统.ValueTuple,Version=4.0.1.0,Culture=neutral,PublicKeyToken=CC7B13FFCD2DD51'或其依赖项之一.系统找不到指定的文件.

我不明白为什么它找不到文件,因为它和我的DLL在同一个文件夹中.显然,MS并没有把这个组件包括在内.Net框架4.6.2.

请注意,我的DLL是使用计算机在Windows中注册的.配置文件.我猜如果我也添加了系统.ValueTuple.dll到这个文件,它将工作(尚未try ,不确定这是最好的方法,尤其是长期.)除了等待4.6.3并希望它包括这个组件之外,还有更好的方法吗?

推荐答案

我通过在计算机的machine.config文件中注册System.ValueTuple(以及已经在那里注册的我自己的DLL)解决了这个问题.不过,我并不特别喜欢这种方法,因为它依赖于随时可能更改的DLL版本.希望微软能将此程序集添加到下一版本的.Net Framework中.

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" />
    <bindingRedirect oldVersion="0.0.0.0-99.99.99.99" newVersion="4.0.1.0" />
    <codeBase version="4.0.1.0" href="e:\exec\System.ValueTuple.dll" />
  </dependentAssembly>
  ...
</assemblyBinding>
</runtime>

.net相关问答推荐

节省用户在整个应用程序中使用的Flutter

NETSDK1083:无法识别指定的 RuntimeIdentifierwin10-x64

ECS服务无法从Cognito获取配置

dotnet ef dbcontext scaffold command --data-annotations 或 -d 命令行参数似乎不起作用

关于在 .NET 中干净地终止线程的问题

使用 Thread.Abort() 有什么问题

如何在没有抽象基类的情况下强制覆盖后代中的方法?

如何从 appsettings.json 中获取价值

如何删除只读文件?

如何将自定义 UserControl 显示为对话框?

为什么 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

.NET 中是否有可序列化的通用键/值对类?

C# 中的 override 和 new 关键字有什么区别?

是否可以在 XP 上运行 .NET 4.5 应用程序?

如何获得 Bin 路径?

找不到库 hostpolicy.dll

SqlBulkCopy 的推荐批量大小是多少?

SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有什么区别?

System.Array.CopyTo() 和 System.Array.Clone() 之间的区别

在 .NET 中乘以时间跨度