【问题标题】:How to combine two managed x86/x64 dlls into one managed AnyCpu library?如何将两个托管的 x86/x64 dll 合并到一个托管的 AnyCpu 库中?
【发布时间】:2017-04-28 07:17:57
【问题描述】:

第三方编译非托管代码(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 .我已经非常成功地做到了这一点,但是这种方法不太适合 managed dll。我必须从托管 C# PInvoke 到托管 C# dll - 这对我来说听起来不对。

问:有没有办法将两个托管的 x86/x64 dll 合并为一个托管的 AnyCpu dll 而无需 PInvoke?

【问题讨论】:

  • 据我所知,引用 x86 将允许您编译的目标在 x86 和 x64 上运行。我什至认为它可以让您将项目编译到 AnyCpu 而不仅仅是 x86 - 但我不完全确定。
  • @gilmishal:没有经过测试,但是......对于很多事情,x86 是一个很好的默认值,同意。但是,我的第 3 方库适用于大型文件/数据集,因此 64 位提供了实际优势。

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


【解决方案1】:

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

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

你的命令行是:

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

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

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

【讨论】:

  • 事实证明,对于我的特定场景,依赖关系非常复杂(甚至包括静态非托管库)并且处于可怕的状态(我刚刚发现 x86 dll 根本不起作用)。 Costura 和 LibZ 都不支持静态非托管的东西(永远不会调用 AssemblyResolve)。对于更简单的场景,这可能会起作用。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 2017-08-03
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多