Проверка Mono.Cecil и Mono.Cecil.Cil

У меня есть некоторый код для загрузки исполняемого файла и показывает его код CIL пользователю. Для этого я использую Mono.Cecil и Mono.Cecil.Cil.

Теперь я хочу сделать что-то другое: я хочу знать, есть ли у пользователя Mono.Cecil и Mono.Cecil.Cil в его системе. для этого я подумал использовать Reflection.Assembly.Load с Mono.Cecil и Mono.Cecil.Cil. Что-то вроде:

public void PrintInstr( ) {
    try
    {
        Reflect.Assembly mc = Reflect.Assembly.Load( "Mono.Cecil" );
        Reflect.Assembly mcc = Reflect.Assembly.Load( "Mono.Cecil.Cil" );
    }
    catch( Exception )
    {
        System.Console.WriteLine( "\"Mono.Cecil\" or \"Mono.Cecil.Cil\" not found " );
        return;
    }
    //[...]
}

Но я получаю только следующую ошибку:

Could not load file or assembly 'Mono.Cecil' or one of its dependencies.
The system cannot find the file specified.

И, конечно же, у меня есть Mono.Cecil и Mono.Cecil.Cil. Я не использую правильно Assembly.Load? Если это так, может кто-нибудь сказать мне, как использовать Assembly.Load, чтобы иметь возможность загружать Mono.Cecil и Mono.Cecil.Cil без поиска пути (чтобы сделать единственный исполняемый файл для использования под Windows или GNU/Linux с моно)?

Примечание: я работаю под Linux Mint с MonoDevelop 2.6 или под Windows 7 с MonoDevelop 2.8.

1 ответ

Решение

Похоже, вы неправильно понимаете, что делает Assembly.Load для загрузки сборки. Я думаю, что вы пытаетесь найти, есть ли у пользователя Mono.Cecil в GAC. Проблема заключается в том, что при вводе частичного имени выполняется поиск только путей поиска текущего AppDomain, GAC используется только при указании полного имени. Это задокументировано здесь:

Не рекомендуется указывать частичное имя сборки для assemblyRef. (Частичное имя опускает один или несколько маркеров языка, версии или открытого ключа. Для перегрузок, которые принимают строку вместо объекта AssemblyName, "MyAssembly, Version=1.0.0.0" является примером частичного имени и "MyAssembly, Версия =1.0.0.0, Культура = нейтральная, PublicKeyToken=18ab3442da84b47"является примером полного имени.) Использование частичных имен отрицательно влияет на производительность. Кроме того, частичное имя сборки может загружать сборку из глобального кэша сборок только в том случае, если в базовом каталоге приложения есть точная копия сборки (BaseDirectory или AppDomainSetup.ApplicationBase).

Дополнительную информацию о том, как CLR Probes для сборок можно найти здесь: http://msdn.microsoft.com/en-us/library/aa720133.aspx

Именно поэтому Assembly.LoadWithPartialName() существует, но она устарела.

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