首页 > 解决方案 > 具有弱命名引用的 C# 强命名程序集在一种上下文中工作,但在另一种情况下不工作

问题描述

概括

我正在为 C# 中的视频游戏开发一个 mod。我还在为这个视频游戏的模组开发一个实用程序库,我想在我的模组中使用它。出于我认为很好的理由*,实用程序库被强烈命名。当我在游戏中加载它时,这工作正常,但是当我尝试对使用实用程序库的 mod 组件运行 NUnit 单元测试时,我得到实用程序库引用的程序集的程序集加载失败。我想要某种方法让单元测试与强命名的实用程序库一起运行,或者如果失败,则在此游戏的两个模块之间重用代码的其他一些机制不会遇到强命名的程序集问题。

这里涉及的所有程序集是什么?

GameEngine.dll是我正在修改的游戏中的一个程序集。它包含游戏核心的类型和方法,这些类型和方法必须用于使 mod 做 mod 事情。我无法控制它或它的行为。它没有被强烈命名。

Mod.dll是我正在开发的 mod 的中央程序集。它引用了 GameEngine.dll 和 UtilityLibrary.dll。它没有被强烈命名。

Utilities.dll包含在游戏的多个模组中广泛使用的实用功能和类型。我正在开发它。它引用了 GameEngine.dll。由于下面讨论的原因,它被强烈命名。

ModUnitTests.dll是我的 mod 代码的一组 NUnit 单元测试。我正在开发它。它引用了 GameEngine.dll 和 Mod.dll。

这些都是 .Net Framework 3.5,除了 ModUnitTests,它是 4.0。

确切的问题是什么?

当我在游戏中加载 mod 时,一切正常,Mod.dll 可以使用 Utilities.dll 中的内容。引用不同版本 Utilities.dll 的多个 mod 可以正常加载并使用其程序集版本中的类型和方法。

但是当我运行使用 Utilities.dll 函数的单元测试时,程序崩溃并且我得到错误System.IO.FileLoadException: 'Could not load file or assembly 'GameEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044)。如果 Utilities.dll 没有强命名,一切正常。我的理解是,我收到此错误是因为强命名的 Utilities.dll 试图加载弱命名的 GameEngine.dll,这是不允许的。但如果是这样的话,为什么它在游戏中起作用?

为什么程序集被强命名?

(或者,“不要再打自己了”)。如果两个不同的 mod 都使用 Utilities.dll 并加载到游戏中,则要加载的第二个 mod 将从第一个 mod 包含的 Utilities.dll 中获取类型和功能。如果版本不匹配,这将以令人困惑的方式崩溃。通常的 DLL 地狱问题。

我只是使用强命名来获得可以将多个版本的程序集加载到同一进程中的行为。

我知道如果 Mod1 加载 Utility1,Mod2 加载 Utility2,然后 Mod1 将类型从 Utility1 传递给 Mod2,可能会出现问题。由于游戏的结构方式和游戏模组的工作方式,这不应该是一个问题,无论如何它仍然比从 Mod2 开始使用 Utility1 的情况要好。

帮助!

我正在寻找的是一种让 ModUnitTests 加载和运行的解决方案,即使强命名的 Utilities.dll 引用了弱命名的 GameEngine.dll。这似乎在游戏中运行时有效,因此至少在理论上是可行的。

如果这不是问题,那么我正在寻找 C# 人们在需要类似于静态链接的东西时使用的任何策略。

标签: c#.net

解决方案


推荐阅读