2010-07-18 17 views
1

在我的VS2010解決方案中,C#應用程序項目引用了F#庫項目。在調試引用F#lib的C#應用​​程序時沒有可用的源代碼

當從F#lib拋出NullReferenceException時,調試器無法找到拋出的點異常。它只是說'沒有可用的資源'。

我應該改變一些選項還是VS2010的限制?

我加了一些示例代碼:

F#項目 '分享幫助'

module Module1 

type AA() = 
    let _a = "xx" 
    member x.a = _a 

let aa:AA option = None 

let b() = 
    aa.Value.a // null reference occurs here 

C#項目 'ConsoleApp1'

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Console.Out.Write(Module1.b()); 
      Console.In.Read(); 
     } 
    } 
} 

回答

2

此,原則,工作不塞汀任何其他選項。有幾件事要檢查:

  • 運行時可以找到你的F#庫的PDB文件嗎?

    如果PDB文件與DLL位於同一目錄中,應該這樣做。您還可以查看「輸出」窗口並從組合中選擇「調試」,以查看應用程序啓動時打印的信息 - 您可以看到符號是否已加載。如果在某個特殊目錄中有PDB符號,可以在工具 - >選項 - >調試 - >符號中指定目錄。

  • 當您嘗試在F#源代碼中設置斷點時會發生什麼?

    它是否說類似「符號未加載」(並以灰色顯示斷點)?它是否顯示了可用於查找問題原因的任何其他信息?

+0

Thnx Tomas。我檢查了pdb是在同一個目錄下,並且輸出窗口顯示F#庫的符號已加載。斷點也很好。但仍然'沒有可用的源' 我在我的問題中添加了一些示例代碼。日Thnx。 – 2010-07-18 02:13:48

+0

可能不是問題的原因(在此答案後添加了示例),但來自我的+1,因爲有用的調試技巧很有用。 – cfern 2010-07-18 08:00:19

0

錯誤不是由任何C#/ F#interop問題引起的。 當您調用b()時,它會嘗試訪問無選項值的值,該值在運行時會引發空引用異常。

在F#lib中,嘗試用let aa:AA option = Some(AA())替換let aa:AA option = None。 C#代碼應該打印'xx'。

向外部世界公開F#選項類型時,可以允許來自空選項的空返回值而不是異常。例如:

module Module1 

//attribute needed in order to be able to return null from the match statement 
[<AllowNullLiteralAttribute>] 
type AA() = 
    let _a = "xx" 
    member x.a = _a 

let aa:AA option = None 

let b() = match aa with 
      | None -> null 
      | Some value -> value 

並在任何使用此F#庫的代碼中檢查爲空。

注意AllowNullLiteral屬性。試着註釋掉這個屬性,你會發現F#在第一個匹配分支中不會識別null值。

+0

Thnx,cfern。其實,我的問題是關於調試。我的代碼使用很多值,我猜其中一個正在做空引用異常,但我找不到它。只要我使用類型值,我可能需要進行類型匹配。 – 2010-07-19 13:24:25

相關問題