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

Cam*_*art 8 f# type-providers

我在使用F#Generative Type Provider的程序集中创建的任何类型时遇到问题.我创建了一个YouTube视频来演示这一点.

我得到的错误消息是:

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

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

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

我们将不胜感激.我希望在.proto文件的F#Type Provider上取得更多进展,但我坚持这一点.

kvb*_*kvb 5

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

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

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