CurrentDomain.AssemblyResolve не может разрешить «некоторые» сборки - PullRequest
3 голосов
/ 13 февраля 2011

После нахождения ответа мой последний вопрос по разрешению сборки ( AppDomain.CurrentDomain.AssemblyResolve запрашивает сборку .resources? ), теперь я могу вставлять сборки ссылок в мою программу, за исключением того, чтоэто не работает, некоторые ссылки как-то.

Прежде всего, я установил свой распознаватель сборок при самом первом входе в мою программу .cs

    // attach our embedded assembly loader.
    AppDomain.CurrentDomain.AssemblyResolve += AssemblyManager.Instance.Resolver;

Вот мой фактический распознаватель;

public Assembly Resolver(object sender, ResolveEventArgs args)
{
    AssemblyName askedAssembly = new AssemblyName(args.Name);

    lock (this)
    {
        Assembly assembly;

        string resourceName = string.Format("Assets.Assemblies.{0}.dll", askedAssembly.Name);
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
        {
            if (stream == null)
            {
                LogManager.Instance.Write(LogMessageTypes.Fatal, string.Format("Can not resolve asked assembly: {0}", askedAssembly.Name));
                MessageBox.Show(i18n.CanNotLoadRequiredAssembliesMessage, i18n.CanNotLoadRequiredAssembliesTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
                Environment.Exit(-1);
            }

            byte[] assemblyData = new byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            assembly = Assembly.Load(assemblyData);
        }

        LogManager.Instance.Write(LogMessageTypes.Trace, "Loaded embedded assembly: " + askedAssembly.Name);

        return assembly;
    }
}

Теперь моя программа ссылается на эти сборки библиотек.

  • Esent.Collections.dll
  • Esent.Interop.dll
  • HtmlAgilityPack.dll
  • Ionic.Zip.Reduced.dll
  • System.Windows.Forms.Calendar.dll
  • AxInterop.ShockwaveFlashObjects
  • Interop.ShockwaveFlashObjects
  • irrKlang.NET4.dll
  • ikpMP3.dll
  • Nini.dll (решено)

С моим резольвером выше;я могу встроить Esent.Collections, Esent.Interop, HtmlAgilityPack, Ionic.Zip.Reduced, System.Windows.Forms.Calendar, AxInterop.ShockwaveFlashObjects, Interop.ShockwaveFlashObjects и решить их во время выполнения.

*приходит с irrKlang.NET.4, сборками Nini и ShockwaveFlash, в которых, если я пытаюсь встроить эти сборки и решить их во время выполнения, у меня возникают проблемы.

Для irrKlang я могу понять проблему как irrKlang.Сборка NET4 ссылается на неуправляемый файл ikpMP3.dll, который я не могу найти самостоятельно.

Для Nini.dll, на самом деле я могу встроить эту сборку и использовать запущенные конфигурации отладки / выпуска VS, она просто работает нормально, но когда яЗапустите программу самостоятельно из проводника, программа просто отказывается запускаться (без ошибок или какой-либо информации).

Любая помощь приветствуется.

Обновление Теперь, благодаря ответу Марка Гравелла, я могу загрузить файл Nini.dll.

Для части irrKlang, поскольку irrKlang.NET4.dll является управляемой сборкой.bly, который требует ikpMp3.dll - неуправляемый - если я пытаюсь разрешить irrKlang.NET4.dll во время выполнения, он может получить доступ к своей требуемой зависимости ikpMp3.Есть ли обходной путь для этого?

1 Ответ

4 голосов
/ 13 февраля 2011

Распространенной проблемой здесь является использование типов до того, как вы сможете зарегистрировать событие сборки-разрешения. В частности, обратите внимание, что система должна иметь возможность JIT метода, прежде чем она сможет запустить запуск метода - включая Main().

Таким образом, если ваша точка входа (Main()) выполняет перехват событий , а также обращается к рассматриваемым типам, она попытается разрешить типы (для JIT) до или имеет возможность подписаться.

сделать минимум в основном; переместить «реальный» код в другой метод, который вызывается только после того, как событие определенно подписано.

Например:

static void Main() {
    SubscribeAssemblyResolver();
    ExecuteApplication();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...