9

我在为 F# 生成类型提供程序使用在程序集中创建的任何类型时遇到问题。我创建了一个YouTube 视频来演示这一点。

我收到的错误消息是:

  • 编译单元“Addressbook1”中的模块/命名空间“教程”不包含命名空间、模块或类型“Person”
  • 在程序集“Addressbook1”中找到对类型“tutorial.Person”的引用,但在该程序集中找不到该类型

我不明白,因为类型肯定在程序集中。为了解决这个问题,程序集是一个非常基本的 C# dll。视频中的代码可通过 git 获得:

git 网址:https
://code.google.com/p/froto/ git 分支:帮助

任何故障排除想法将不胜感激。我希望在.proto 文件的 F# 类型提供程序上取得更多进展,但我坚持这一点。

4

1 回答 1

5

我快速浏览了您的代码 - 正如我在评论中提到的,我认为使用由 F# 3.0 示例包定义并在 MSDN 上记录(有点)的 ProvidedTypes API 会更好地为您服务。

基本上,原始类型提供程序 API 有很多假设,您很难手动维护这些假设。我认为您遇到的具体问题是编译器希望看到tutorial.Person在您的程序集中命名的类型(因为它是 on 方法的返回类型tutorial.AddressbookProto,您将其公开为生成的类型),但它从未嵌入到你的大会。

然而,这实际上只是几个问题之一——您可能已经意识到,如果您定义的类型不是tutorial.AddressbookProto. 这是因为您使用具体类型作为返回 from ApplyStaticArguments,但您通常希望使用System.Type准确反映用户使用的命名空间和类型名称的合成实例(例如,在 ProvidedTypes API 中,ProvidedTypeDefinition该类继承自System.Type并处理此簿记)。

于 2013-01-11T19:30:14.767 回答