Проверка 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 без поиска пути (чтобы сделать единственный exe-файл, который будет использоваться под Windows или GNU/Linux с моно)?

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


person carlesh    schedule 13.03.2012    source источник
comment
Вы имеете в виду, что хотите узнать, находится ли Сесил в глобальном кэше сборок?   -  person svick    schedule 14.03.2012


Ответы (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-пробах для сборок можно найти здесь: http://msdn.microsoft.com/en-us/library/aa720133.aspx

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

person Johannes Rudolph    schedule 14.03.2012