9

我正在开发一个依赖于 FParsec 0.9.2.0 的 F# 类型提供程序。它取决于 FSharp.Core 4.0.0.0。当我尝试使用 F# 类型提供程序时,我收到此错误:

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

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

我尝试添加 aFroto.Gen.dll.config和 a FParsec.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,但这并不总是奏效。

4

2 回答 2

3

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

于 2013-02-04T20:17:24.010 回答
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/"
    ...
于 2014-03-28T09:11:07.340 回答