C #: Type.GetType равен нулю для классов динамически загружаемых сборок - PullRequest
0 голосов
/ 31 мая 2018

Это мой первый вопрос о переполнении стека.Я пытался найти решение, но нигде не смог найти ни одного, ни похожего.

У меня есть проект веб-сайта MVC, в котором есть разные библиотеки DLL (плагины), и поскольку эти библиотеки не нужно развертывать во всех средах, которые яЯ загружаю их динамически в Application_Start в Global.asax из папки и развертываю только то, что мне нужно для каждой среды.Поэтому мне не нужно ссылаться на них в проекте, чтобы у меня была одна сборка для всех.

Моя проблема в том, что Type.GetType ("FullClassName, AssemblyName") всегда возвращает ноль для объектов, которые находятся в этихПлагины.

В Application_Start я в основном загружаю сборку, регистрирую ее в GAC, загружаю в текущий AppDomain, инициализирую ее метаданные и запускаю ее загрузчик с отражениями для регистрации компонентов в глобальном контейнере Unity.

foreach (string file in fileList) {
    string fileName = (Path.GetFileName(file));
    Assembly asm = Assembly.LoadFrom(file);

    foreach (Type assemblyType in asm.GetTypes()) {
        new System.EnterpriseServices.Internal.Publish().GacInstall(file);
        AppDomain.CurrentDomain.Load(asm.GetName());
        MetaDataHelper.InitialiseMetadataForAssembly(asm);
        IBootstrapper bootsrapper = (IBootstrapper)Activator.CreateInstance(assemblyType, container);
        bootsrapper.Initialise();                                    
    }
}

Я также попробовал этот подход, когда Strong Naming назвал мои сборки и добавил их в web.config безрезультатно.

<dependentAssembly>
    <assemblyIdentity name="MyAssembly"  culture="neutral" publicKeyToken="123456789"/>
        <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
    </dependentAssembly>

Кто-нибудь может мне помочь, пожалуйста, я что-то упустил?

Заранее спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Я понял это.Я не могу поверить, насколько простым было решение.После некоторого исследования AppDomain.CurrentDomain и некоторой документации MSDN мне просто нужно было реализовать и добавить обработчик событий разрешения сборки в текущий домен.

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve);


 static Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        --args.Name is the assembly name passed to the GetType("FullClassName,AssemblyName");
        --Search in LoadedAssemblies by name and return it.
    }
...