Для провайдера типа 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/"
    ...
Другие вопросы по тегам