1
4
有一种巧妙的方法可以做到这一点,但它确实增加了额外的代码负担(尽管你可以在应用程序开始时就这么做)。 它依赖于创建一个新的应用程序域,其中包含从何处加载程序集的特定于平台的专用bin路径。然后将本机代码隐藏在32位或64位目录中,它将加载最合适的目录。 因此,为了论证,您有一个C++ CLR项目,它是:
现在您需要更改代码,以便它创建一个新的应用程序域,并在该域中运行所有代码(您也可以在默认值中创建类型,但这会使它稍微复杂一些,而且可能会变慢)。 因此,请定义一个引导类来启动应用程序:
现在确保删除NativeLib.dll从当前的应用程序目录中,创建一个x86和x64目录,并在每个目录中放置本机lib的相应版本。运行它,它现在应该在32位和64位上工作。
当然有一些警告,它依赖于程序集通常是后期绑定的事实,因此如果在创建应用程序域之前使用本机类型,它可能会中断。还有一些方法可以使它更通用,例如,您可以编写一个包装器exe来引导包含真实代码的延迟加载程序集,这意味着它将更通用。 当然,当您希望它成为一个库时,您可能必须使用一个引导程序集,在静态构造函数中处理appdomain的私有路径,这可能不是一个非常礼貌的做法;) |
2
0
编译x64和x86版本,分别为它们创建PInvoke sig,只需为要使用的每个sig创建一个方法即可内部尺寸并为当前位调用正确的pinvoke。 除非我错了,但我相信这是可以做到的,我不记得你是否需要一个额外的间接层,因为你使32位和64位的互操作与各自的pinvoke sig和反射加载正确的一个取决于内部尺寸而不是将pinvoke sig放在同一个二进制文件中。 |
melmi · 如何在C中实例化堆中的结构# 7 年前 |
Max · 使用flatbuffers从C#序列化到本机内存缓冲区 7 年前 |
Saurabh Agrawal · 如何在数据标签C中使用模式属性# 7 年前 |
Nat · 如何在UWP应用程序中创建COM对象?(C#) 9 年前 |