对于F#类型提供程序,如何为依赖程序集执行绑定重定向?

时间:2012-11-19 23:00:30

标签: f# type-providers assembly-binding-redirect

我正在研究一个依赖于FParsec 0.9.2.0的F#Type Provider。它取决于FSharp.Core 4.0.0.0。当我尝试使用F#Type提供程序时,出现此错误:

  

{“无法加载文件或程序集'FSharp.Core,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个依赖项。系统找不到指定的文件。”:“FSharp.Core ,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a“}

     

===预绑定状态信息===
  日志:DisplayName = FSharp.Core,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a(完全指定)
  日志:Appbase = file:/// C:/ Program Files(x86)/ Microsoft Visual Studio 11.0 / Common7 / IDE /
  日志:初始PrivatePath = NULL
  调用程序集:FParsec,Version = 0.9.2.0,Culture = neutral,PublicKeyToken = e5c8267bb3bd1265。

我尝试添加Froto.Gen.dll.configFParsec.dll.config,其中包含此内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="4.0.0.0" newVersion="4.3.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

没有运气。有任何想法吗?我的下一个行动计划是建立一个新的FParsec.dll,但这并不总是有效。

2 个答案:

答案 0 :(得分:3)

当args.Name需要4.0.0.0时,您是否尝试重写AppDomain.CurrentDomain.AssemblyResolve并在FSharp.Core 4.3.0.0的位置上执行显式Assembly.LoadFrom?

答案 1 :(得分:2)

您实际上可以在类型提供程序中定义自己的程序集解析程序。

如果覆盖ResolveAssembly方法,则可以提供自己的程序集解析方案。默认实现非常简单:

default this.ResolveAssembly(args) = 
    let expectedName = (AssemblyName(args.Name)).Name + ".dll"
    let expectedLocationOpt = 
        probingFolders 
        |> Seq.map (fun f -> IO.Path.Combine(f, expectedName))
        |> Seq.tryFind IO.File.Exists
    match expectedLocationOpt with
    | Some f -> Assembly.LoadFrom f
    | None -> null

您还可以添加探测路径以影响检查装配分辨率的位置:

[<TypeProvider>] 
type MyProvider(config: TypeProviderConfig) as this = 
    inherit TypeProviderForNamespaces()
    do this.RegisterProbingFolder "/Developer/MonoTouch/usr/lib/mono/2.1/"
    ...