第三方编译非托管代码(x86 / x64分隔)并为任一平台提供托管C#.NET dll(x86 / x64分隔):
这是我收到的内容(既不是本机代码也不是非托管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中?
答案 0 :(得分:3)
是的,有。我已成功使用LibZ将混合模式程序集作为资源打包到托管的AnyCPU程序集中。该库为其运行的平台选择正确的程序集。
这是同一作者在lz4net中使用的技术。
您的案例中的命令行将是:
libz inject-dll --assembly YourAnyCpuLib.dll - 包含FooManaged.x86.dll - 包含FooManaged.x64.dll
需要注意的是,AnyCPU程序集仍然必须引用其中一个依赖于平台的库,因此您将在构建时收到警告。只需选择您用于测试/开发目的的那个。
另外,请确保第三方许可证不会禁止您将程序集嵌入到您自己的程序中。