Незначительная разница версий в gacutil и среде, вызывающая большие головные боли

Вот ситуация:

У меня есть DLL, скомпилированная в .NET 2, которая помещается в глобальный кеш сборки. У меня есть файл myDLL.dll.config, который гласит:

<configuration>
   <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="myDLL" publicKeyToken="c426c33bab532523" />
        <bindingRedirect oldVersion="1.2.2.0-1.2.2.22" newVersion="1.2.2.23" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Затем я использую компоновщик сборки для создания файла политики:

al /link:myDLL.dll.config /out:policy.1.2.myDLL.dll /keyfile:myDLL.snk

Но когда я пытаюсь загрузить файл политики в глобальный кеш сборки, используя

gacutil -i policy.1.2.myDLL.dll

Я получаю сообщение об ошибке:

Failure adding assembly to the cache:  This assembly is built by a 
runtime newer than the currently loaded runtime and cannot be loaded.  

Версия .NET Global Assembly Cache Utility — 2.0.50727.42, но я проверил версию в среде сборки, создав новый консольный проект C# .NET 2 и выполнив следующее:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MessageBox.Show(Environment.Version.ToString());
        }
    }
}

и моя среда. Версия 2.0.50727.5466.

Все это происходит на одном и том же компьютере, в частности, на моем dev box.

Я могу скопировать myDLL.dll из папки \bin\release в папку c:\Windows\assembly, без проблем. Но попытка либо скопировать файл policy.1.2.myDLL.dll из \bin\release в \assembly, либо с помощью gacutil не удалась.


person CurtisHx    schedule 12.06.2013    source источник
comment
social.msdn.microsoft .com/Forums/en-US/biztalkgeneral/thread/ ?   -  person Justin Pihony    schedule 12.06.2013
comment
Вы уверены, что используете версию .NET 2.x?   -  person Tim B    schedule 12.06.2013
comment
@TimB Я не уверен. Я открыл новую командную строку Visual Studio 2010, набрал al и получил Assembly Linker version 10.0.30319.1. Я немного новичок в работе с dll в глобальном кеше сборки.   -  person CurtisHx    schedule 12.06.2013
comment
У вас должен быть al.exe в %PROGRAMFILES(X86)%\Microsoft SDKs\Windows\v7.0A\Bin, а другой — в %PROGRAMFILES(X86)%\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools. Обе версии имеют одинаковый номер версии, но первая предназначена для .NET 2.x, а вторая — для .NET 4.x. Я бы указал полный путь, чтобы убедиться, что вы используете правильный.   -  person Tim B    schedule 12.06.2013
comment
@TimB, ты решил мою проблему. Теперь я должен пойти объяснить своему боссу, почему я потратил полдня, работая над этим *$%! вещь.   -  person CurtisHx    schedule 12.06.2013


Ответы (1)


Проблема заключалась в том, что сборка политики компилируется для .NET 4.x.

Существует al.exe в %PROGRAMFILES(X86)%\Microsoft SDKs\Windows\v7.0A\Bin и еще один в %PROGRAMFILES(X86)%\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools. Обе версии имеют одинаковый номер версии, но первая предназначена для .NET 2.x, а вторая — для .NET 4.x. Вы должны указать полный путь, чтобы убедиться, что вы используете правильный.

person Tim B    schedule 12.06.2013