4

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

  • FooManaged_x86.dll
  • FooManaged_x64.dll

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

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

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

我知道,我可以通过在运行时动态加载适当的 dll(在后台使用 DllImport 和手动 AssemblyLoad)将非托管x86/x64 dll(使用 Fody.Costura)合并到一个托管 dll 中。我已经非常成功地做到了这一点,但是这种方法不太适合托管dll。我将不得不从托管 C# PInvoke 到托管 C# dll - 这对我来说听起来不对。

问:有没有什么方法可以将两个托管的 x86/x64 dll 合并为一个托管的 AnyCpu dll,而无需 PInvoke?

4

1 回答 1

3

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

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

在您的情况下,命令行将是:

libz 注入-dll --assembly YourAnyCpuLib.dll --include FooManaged.x86.dll --include FooManaged.x64.dll

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

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

于 2016-12-13T09:42:04.657 回答