C# 调试引用F lib的C应用程序时没有可用的源代码

C# 调试引用F lib的C应用程序时没有可用的源代码,c#,f#,nullreferenceexception,C#,F#,Nullreferenceexception,在我的VS2010解决方案中,C应用程序项目引用F库项目 从F lib引发NullReferenceException时,调试器无法找到引发的点异常。它只是说“没有可用的来源” 我是否应该更改一些选项,或者这是VS2010的限制 我添加了一些示例代码: F项目“图书馆1” module Module1 type AA() = let _a = "xx" member x.a = _a let aa:AA option = None let b() = aa.Valu

在我的VS2010解决方案中,C应用程序项目引用F库项目

从F lib引发NullReferenceException时,调试器无法找到引发的点异常。它只是说“没有可用的来源”

我是否应该更改一些选项,或者这是VS2010的限制

我添加了一些示例代码:

F项目“图书馆1”

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();
        }
    }
}

原则上,这应该在不设置任何附加选项的情况下工作。需要检查的几件事:

运行时能否找到F库的PDB文件

如果PDB文件与DLL位于同一目录中,则应该这样做。您还可以查看输出窗口并从组合框中选择Debug,以查看应用程序启动时打印的信息—在那里您可以查看是否加载了符号。如果在某些特殊目录中有PDB符号,可以在工具->选项->调试->符号中指定目录

当您尝试在F源中设置断点时会发生什么

它是否表示未加载符号并以灰色显示断点?它是否显示了可用于查找问题原因的任何其他信息


该错误不是由任何C/F互操作问题引起的。 当您调用b时,它会尝试访问None选项值的值,这会在运行时引发null引用异常

在F库中,尝试将let aa:aa option=None替换为let aa:aa option=SomeAA。然后,C代码应打印“xx”

当向外界公开F选项类型时,可以允许空选项返回null值,而不是异常。例如:

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库的任何代码中是否存在null


请注意AllowNullLiteral属性。尝试注释该属性,您将看到F无法识别第一个匹配分支中的值null。

Thnx Tomas。我检查了pdb是否在同一个目录中,输出窗口显示F库的符号已加载。断点也可以很好地工作。但仍然“没有可用的源代码”,我在问题中添加了一些示例代码。Thnx。可能不是问题的原因。答案后面添加了示例,但我提供了+1,因为有用的调试提示非常有用。Thnx,cfern。实际上,我的问题是关于调试的。我的代码使用了很多