GAC - сборка находится в GAC, но "не удалось загрузить файл или сборку"
У меня есть Interop dll, созданный Visual Studio для стороннего COM-объекта, который я использую в.NET dll.
Я зарегистрировал в GAC как мою dll-библиотеку, так и dll Interop. Я должен использовать GAC, потому что эти библиотеки DLL используются рабочим процессом SharePoint 2010.
Когда выполнение достигает точки, где моя dll вызывает Interop dll, была выдана следующая ошибка: "Не удалось загрузить файл или сборку"… "Системе не удалось найти указанный файл" вместе с ожидаемой версией и открытым ключом.
Если я проверю средство просмотра журнала привязки Fusion Assembly, в записи журнала Interop dll появится следующая ошибка:
LOG: GAC Lookup was unsuccessful.
Я вижу эту сборку в GAC, и она имеет правильную версию и маркер открытого ключа, как указано в исключении FileNotFound.
В чем дело?
4 ответа
Проблема заключается в том, что, поскольку версия и открытый ключ действительны, архитектура процессора взаимодействия должна соответствовать архитектуре вашей вызывающей библиотеки DLL. И, конечно же, Target Framework должен быть той же версии.
Моя dll была скомпилирована с процессором MSIL (Agnostic, AnyCPU), но по какой-то странной причине Visual Studio настаивала на компиляции Interop для x386.
(Возможно, это обычно не вызывает проблемы, но мой сервер SharePoint работает на 64-битной основе, что могло вызвать появление симптомов).
Решение состоит в том, чтобы скомпилировать Interop самостоятельно:
1 - Отмените регистрацию вашей dll и взаимодействия от GAC.
2 - Запустите командную строку Visual Studio версии Visual Studio, которая относится к.NET Framework, на который нацелена ваша dll (т.е. я разрабатывал свою dll в Visual Studio 2010, нацеленную на.NET 3.5. Чтобы сделать этот шаг, мне нужно было запустить Командная строка Visual Studio 2008)
3 - Генерация взаимодействия с использованием Tlbmp
tlbimp <full path and filename of COM .tlb> /out:c:\.\Interop.CoolThirdParty.dll /keyfile: <full path and filename of snk> /machine:Agnostic /Namespace:CoolThirdParty
/ Machine:Agnostic вызывает сборку Interop, ориентированную на архитектуру процессора MSIL, которая аналогична моей dll.
4 - Удалите старую ссылку на Interop в вашем dll проекте
5. Удалите старый файл Interop и замените его на тот, который вы только что создали (например, c:.\Interop.CoolThirdParty.dll).
6 - Добавьте ссылку в вашем проекте в новый Interop.
7 - Восстановить
8 - Зарегистрируйте свою новую сборку dll и новый Interop в GAC
Это должно начать работать.
Закройте Visual studio.... удалите все папки из C:\Windows\Microsoft.NET\Framework\v4.0.30319\ Временные файлы ASP.NET
Это должно решить вашу проблему....
Надеюсь, что ваш сторонний COM-объект также зарегистрирован на компьютере
Я получил это для строки в моем webconfig в compilation.assemblies, ссылающейся на сборку, которая была в GAC. Проблема была в том, что кто-то поместил перенаправление сборки в файл web.config, перенаправляющий с версии, которая была в GAC, на какую-то другую несуществующую версию.