繁体   English   中英

在Visual Studio中使用x64库的F#类型提供程序

[英]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#实现或某些伪造的实现)可能是将平台特定的代码移至外部服务(例如, 用于IPCWCF服务 )。 该进程将始终为64位,但是您的类型提供程序(因为它不会直接依赖于本机库)可以编译为AnyCPU,并且可以在32位进程中正常运行。 您要付出的代价是IPC和复杂性的大幅增加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM