簡體   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