Для провайдера типа F#, как мне сделать перенаправление привязки для зависимой сборки?
Я работаю над провайдером типа F#, который зависит от FParsec 0.9.2.0. Это зависит от FSharp.Core 4.0.0.0. Когда я пытаюсь использовать провайдера типа F#, я получаю эту ошибку:
{"Не удалось загрузить файл или сборку" FSharp.Core, версия =4.0.0.0, культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a'или одна из ее зависимостей. Система не может найти указанный файл.":"FSharp.Core, Version=4.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a "}
=== Предварительно связать информацию о состоянии ===
LOG: DisplayName = FSharp.Core, версия =4.0.0.0, культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a (указана полностью)
LOG: Appbase = file: /// C: / Program Files (x86) / Microsoft Visual Studio 11.0 / Common7 / IDE /
LOG: Initial PrivatePath = NULL
Вызывающая сборка: FParsec, версия =0.9.2.0, культура = нейтральная, 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
, но это не всегда сработает.
2 ответа
Вы пытались переопределить AppDomain.CurrentDomain.AssemblyResolve и сделать явный Assembly.LoadFrom в расположении FSharp.Core 4.3.0.0, когда args.Name требует 4.0.0.0?
На самом деле вы можете определить свой собственный распознаватель сборок в вашем поставщике типов.
Если вы переопределите 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/"
...