如何为生成的程序集创建F#类型提供程序?

时间:2013-01-11 18:07:28

标签: f# type-providers

我在使用F#Generative Type Provider的程序集中创建的任何类型时遇到问题。我创建了一个YouTube video来证明这一点。

我收到的错误消息是:

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

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

获得

git url:https://code.google.com/p/froto/
git branch:help

任何故障排除的想法将不胜感激。我希望在an F# Type Provider for .proto files上取得更多进展,但我坚持这一点。

1 个答案:

答案 0 :(得分:5)

我已快速查看了您的代码 - 正如我在评论中提到的,我认为通过使用由F#3.0示例包定义并在MSDN上记录(有点)的GivenTypes API可以提供更好的服务。

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

然而,这实际上只是几个问题中的一个 - 正如您可能已经意识到的那样,如果您定义的类型被称为tutorial.AddressbookProto以外的任何其他类型,您将看到其他错误。这是因为您使用具体类型作为ApplyStaticArguments的返回,但您通常希望使用合成的System.Type实例,该实例准确反映用户使用的命名空间和类型名称(例如, ProvideTypes API ProvidedTypeDefinition类继承自System.Type并处理此簿记。)