Загрузка подключаемых файлов DLL: "Вызванный элемент не поддерживается в динамической сборке".

У нас есть пользовательские библиотеки DLL, которые не включены в наш начальный установочный файл. Они загружаются во время выполнения. Этот процесс работал нормально при использовании.NET 2.0, но мы получаем сообщение об ошибке "Вызванный элемент не поддерживается в динамической сборке" теперь, когда мы используем.NET 4.0.

try
{
    assem = Assembly.LoadFrom(fi.FullName); //fi is FileSystemInfo
}
catch (FileLoadException) {}
catch (BadImageFormatException) {}
catch (System.Security.SecurityException) {}
catch (ArgumentException) {}
catch (PathTooLongException) {}

5 ответов

Эта ошибка происходит потому, что Assembly.Load нельзя вызывать на динамических сборках. Вы должны отфильтровать динамические сборки перед их использованием.

var assemblies AppDomain.CurrentDomain.GetAssemblies().Where(p => !p.IsDynamic);

Для меня эта проблема не встраивала лицензию на dll Aspose: http://www.aspose.com/community/forums/thread/423874/initializing-the-license-file.aspx

Их код внедряет динамические сборки, когда лицензия не обнаружена, что приводит к сбою их библиотек DLL, а также кучу другого кода, который не совместим с динамическими сборками.

Не уверен, является ли это распространенным методом лицензирования / активации для обеспечения зарегистрированного использования с сторонними dll, поэтому я опубликую его здесь для Google, если это так.

Это в файле app.config позволяет "подключить" библиотеки DLL из удаленных источников.

<configuration>
   <runtime>
      <loadFromRemoteSources enabled="true"/>
   </runtime>
</configuration>

http://msdn.microsoft.com/en-us/library/dd409252.aspx

Я столкнулся с той же ошибкой. В нашей кодовой базе есть метод, который просматривает сборки, загруженные в текущем домене приложений, и ищет данный ресурс по имени.

              Assembly[] allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        
        foreach (Assembly tempAssembly in allAssemblies)
        {
            Stream resourceStream = tempAssembly.GetManifestResourceStream(resourceName);
            // ...
            
        }
        

Если так случилось, что мы наткнулись на динамическую сборку, вызов GetManifestResourceStream завершился ошибкой «Вызванный член не поддерживается в динамической сборке».

Я трачу много часов, чтобы разобраться в этой проблеме.

Мы загружали еще один Class Libraryпроект, который, в свою очередь, создает экземпляр на лету. Так что Ниже работал у меня.

Решение:

Добавить ссылку DLL к основному проекту.

Другие вопросы по тегам