[英]F# Type Provider that uses x64 libraries in Visual Studio
我下面的类型提供程序使用一些本机x64库。 我用
anyCpu
x64标志编译了类型提供程序库。
现在,当我尝试从Visual Studio中的另一个项目IntelliSense加载类型提供程序时,出现以下错误:
类型提供程序“ ...我的类型提供程序...”报告了一个错误:试图加载格式不正确的程序(HRESULT的异常:0x8007000B
为了清楚起见,仅通过在Visual Studio中注册类型提供程序,即可在不运行任何代码的情况下收到此错误。
当我尝试从32位fsi
加载它时,我得到了相同的错误。 但是,当我尝试用fsianycpu
或64位fsi
它工作正常。 我在fsi
得到了类型和自动完成功能。
我猜想发生这种情况是因为VS本身就是x86,IntelliSense /静态代码分析也是x86,在某些时候,他们试图加载依赖x86 lib的类型提供程序代码,并弹出错误。
不幸的是,该库仅支持x64。
有什么办法可以使它们一起工作?
如果您的提供程序使用本机64位库,则不应将其编译为AnyCPU(除非您可以提供32位回退)。 绝对不能在32位计算机上运行(或在Visual Studio的32位进程中运行)。
一种可能的解决方法是在32位进程中调用代码时提供一个后备托管方法(甚至是空的存根)。 例如:
static class NativeInterop {
[DllImport("My64BitLibrary.dll", EntryPoint = "DoStuff")]
private static int DoStuff64(int value);
public static int DoStuff(int value) {
if (Environment.Is64BitProcess)
return DoStuff64(value);
// This is a 32 bit process, I just return a dummy value
// for Visual Studio integration (if applicable)
return 0;
}
}
您的代码不会调用直接导入的DoStuff()
函数,而是会调用托管包装器,该包装器将在64位进程上将调用重定向到本机函数,并且将在32位环境中执行其他操作。 如果在JIT编译此方法时(而不是在有效地调用它们时)将加载依赖项,则可能需要(这是一个未经测试的解决方案)添加第二个间接级别。
我想这不可能在所有地方都应用,这取决于您在哪里调用64位代码以及是否可以提供有效的存根。 如果您不能满足此条件,则您将没有机会将64位库(如果编译为AnyCPU则无关紧要)集成到32位进程中。
对于32位进程,一种替代方法 (以防您无法提供C#实现或某些伪造的实现)可能是将平台特定的代码移至外部服务(例如, 用于IPC的WCF服务 )。 该进程将始终为64位,但是您的类型提供程序(因为它不会直接依赖于本机库)可以编译为AnyCPU,并且可以在32位进程中正常运行。 您要付出的代价是IPC和复杂性的大幅增加。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.