Ссылка на сборку .Net v2.0 из сборки .Net v4.0 также, по-видимому, связывает (и псевдоним) mscorlib v2.0.Зачем? - PullRequest
4 голосов
/ 01 октября 2010

У меня есть сборка .Net, которая импортирует сборку, связанную со средой выполнения v2.0. У меня проблема в том, что когда я пытаюсь запустить несколько тестов на моей сборке, Fusion пытается загрузить неправильную версию зависимой сборки.

После просмотра манифеста сборки я могу понять, почему: неверная версия FSharp.Core связана. В моем файле сборки я делаю FSharp.Core, Version=4.0.0.0 явным, но FSharpPowerPack, по-видимому, ссылается на v2.0.0.0, и некоторые, похоже, "выигрывают" в этой битве ссылок.

Вот манифест:

// Metadata version: v4.0.30319
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern System.Core
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern FSharp.PowerPack
{
  .publickeytoken = (A1 90 89 B1 C7 4D 08 09 )                         // .....M..
  .ver 2:0:0:0
}
.assembly extern mscorlib as mscorlib_8
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly extern System.Core as System.Core_9
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 3:5:0:0
}
.assembly extern FSharp.Core
{
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
  .ver 2:0:0:0
}

Обратите внимание, что, по-видимому, при включении FSharpPowerPack v2.0 и v3.5 других сборок .Net (mscorlib, System, System.Core) включаются и псевдонимы. Почему это происходит? Это связано с проблемой загрузки неправильной версии FSharp.Core?

Редактировать: Для пояснения, моя сборка генерируется компилятором C # v4.0.

1 Ответ

2 голосов
/ 29 октября 2010

Вы управляете приложением, которое будет загружать скомпилированную сборку?Если это так, вы можете использовать перенаправление привязки в файле app.config, чтобы заставить все ссылки FSharp.Core использовать версию 4.0:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
                <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="4.0.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Если у вас возникла проблема с автоматизированным тестовым приложением, вы можетеиметь возможность редактировать свой конфигурационный файл аналогичным образом, предполагая, что это не влияет на его работу.

...