【问题标题】:F# Type Provider that uses x64 libraries in Visual Studio在 Visual Studio 中使用 x64 库的 F# 类型提供程序
【发布时间】:2014-01-10 12:25:13
【问题描述】:

我下面的类型提供程序使用了一些本机 x64 库。我用 anyCpu x64 标志编译了我的类型提供程序库。

现在,当我尝试从 Visual Studio 中的另一个项目中加载类型提供程序时,IntelliSense 出现以下错误:

类型提供者“...我的类型提供者...”报错:An 试图加载格式不正确的程序(异常 来自 HRESULT:0x8007000B

为了清楚起见,我在没有运行任何代码的情况下得到了这个错误,只需在 Visual Studio 中注册类型提供程序。

当我尝试从 32 位 fsi 加载它时,我得到了同样的错误。但是当我尝试使用 fsianycpu 或 64 位 fsi 时,它工作正常。我在fsi 中获得了我的类型和自动完成功能。

我猜这是因为 VS 它本身是 x86,IntelliSense/静态代码分析也是 x86,在某些时候他们尝试加载依赖于 x86 lib 的类型提供程序代码并弹出错误。

不幸的是,该库仅支持 x64。

有什么办法可以一起工作吗?

【问题讨论】:

  • 如果您的提供程序使用本机 64 位库,则不应将其编译为 AnyCPU。它不是。绝对不能在 32 位机器上运行(或者像 Visual Studio 一样在 32 位进程中运行)。
  • 你说得对,应该是64位的。

标签: .net visual-studio f# x86-64 type-providers


【解决方案1】:

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

【讨论】:

  • 这个库非常复杂,而且我没有源代码,因此无法将我的 32 位逻辑写入其中。我希望有一些 F# - VS 解决方案,比如为 F# 64 位制作智能感知,或者将库编译为单独的可执行文件,直接从类型提供程序调用它并解析输出/进行一些进程内通信等。
  • @Klark 可行,但很痛苦!您应该安装(例如)WCF 服务并从您的 typeprovider 连接到该服务器。然后 XY 位无关紧要,EXE 托管的 WCF 服务将运行 64 位,而您的类型提供程序(编译为 AnyCPU)将在 32 位进程上运行。可能,但性能不会那么好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多