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

时间:2016-12-13 09:29:10

标签: c# .net x86 64-bit anycpu

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

  • FooManaged_x86.dll
  • FooManaged_x64.dll

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

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

我的应用程序可以针对AnyCpu(我的目标),引用x64 dll(错误,编译器警告),它只会在它实际运行为x64时才有效。同样,这也是一个特定的平台。

我知道,我可以通过在运行时动态加载approriate dll将非托管 x86 / x64 dll(与Fody.Costura)合并到一个托管dll中(使用DllImport和手动下的AssemblyLoad) 。我已经取得了巨大的成功,但这种方法并不适合托管的 dll。我必须将PInvoke从托管C#转换为托管C#dll - 这对我来说听起来不对。

问:有没有办法在没有PInvoke的情况下将两个托管的x86 / x64 dll合并到一个托管的AnyCpu dll中?

1 个答案:

答案 0 :(得分:3)

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

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

您的案例中的命令行将是:

  

libz inject-dll --assembly YourAnyCpuLib.dll - 包含FooManaged.x86.dll - 包含FooManaged.x64.dll

需要注意的是,AnyCPU程序集仍然必须引用其中一个依赖于平台的库,因此您将在构建时收到警告。只需选择您用于测试/开发目的的那个。

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