C# 调试引用F lib的C应用程序时没有可用的源代码
在我的VS2010解决方案中,C应用程序项目引用F库项目 从F lib引发NullReferenceException时,调试器无法找到引发的点异常。它只是说“没有可用的来源” 我是否应该更改一些选项,或者这是VS2010的限制 我添加了一些示例代码: F项目“图书馆1”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
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。实际上,我的问题是关于调试的。我的代码使用了很多