如何将两个托管 x86/x64 dll 组合成一个托管 AnyCpu 库?

How to combine two managed x86/x64 dlls into one managed AnyCpu library?

第三方编译非托管代码(x86/x64 分隔)并为任一平台提供托管 C# .NET dll(x86/x64 分隔):

这是我收到的(既不是本机代码,也不是非托管 dll)。

然后我可以创建一个面向 x86 或 x64 的 C#.NET 应用程序(或库)并直接引用相应的托管 dll - 一切都很好,但仅限于一个特定平台(不是我的目标)。

我的应用程序可以以 AnyCpu(我的目标)为目标,引用 x64 dll(错误,编译器警告),并且只有当它实际以 x64 运行时它才会工作。同样,这绑定到一个特定的平台。

我知道,我可以通过在运行时动态加载适当的 dll (在后台使用 DllImport 和手动 AssemblyLoad)。我已经成功地做到了这一点,但这种方法不太适合 managed dll。我将不得不从托管 C# 调用 PInvoke 到托管 C# dll——这对我来说是错误的。

问:有没有什么方法可以在没有 PInvoke 的情况下将两个托管的 x86/x64 dll 组合成一个托管的 AnyCpu dll?

是的,有。我已经使用 LibZ 成功地将混合模式程序集作为资源打包到托管 AnyCPU 程序集中。该库为其运行的平台选择正确的程序集。

这是同一作者在lz4net中使用的技术。

您的命令行是:

libz inject-dll --assembly YourAnyCpuLib.dll --include FooManaged.x86.dll --include FooManaged.x64.dll

需要注意的是 AnyCPU 程序集仍然必须引用依赖于平台的库之一,因此您会在构建时收到警告。只需选择您用于 testing/development 目的的那个。

此外,请确保第三方许可不会禁止您将程序集嵌入到您自己的程序中。