用另一个实现替换 .NET 程序集

Replace .NET assembly with another implementation

我有一对使用两个不同后端实现相同功能的程序集:

Engine.OpenGL.dll
Engine.DirectX11.dll

是否可以创建一个 Visual Studio 项目,无需重新编译即可使用这些后端中的任何一个?两个引擎 DLL 公开的 namespaces/classes/methods 是相同的(或者至少我在项目中使用的是相同的)。

我尝试针对其中一个引擎程序集构建我的项目,然后将其替换为另一个(通过覆盖 dll 文件)。这会导致以下错误:

The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

我是否必须创建 2 个单独的项目,它们之间的唯一区别是它们引用的是哪个引擎 DLL?

您不能创建一个名为 "GraphicsEngineContract" 的项目并使用它来定义代表两个不同引擎项目中的各种 类 的接口。然后在您的引擎项目中,您可以确保所有匹配的 类 实现相同的接口(或者从 Contract 项目抽象 类,如果有的话)。

然后您将重构主要项目以仅引用合同项目中的超类型(抽象 类 和接口)。最后,您的初始化过程将通过检测本地系统上可用的内容并根据发现的内容分配具体实例来启动。

那就不是非此即彼的情况了。您可以在本地复制这两个引用并根据最终用户计算机上安装的内容为它们创建对象。

如果您采用这种方法,您可能最终会得到四个项目。主项目、合约项目、directx项目、opengl项目。