我正在研究一个依赖于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.config
和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
,但这并不总是有效。
答案 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/"
...