2012-03-13 4 views
1

У меня есть код для загрузки exe-файла и его код CIL. Для этого я использую Mono.Cecil и Mono.Cecil.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.

+0

Вы хотите знать, есть ли Сесил в глобальном кэше сборки? – svick

ответ

3

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

Supplying a partial assembly name for assemblyRef is not recommended. (A partial name omits one or more of culture, version, or public key token. For overloads that take a string instead of an AssemblyName object, "MyAssembly, Version=1.0.0.0" is an example of a partial name and "MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=18ab3442da84b47" is an example of a full name.) Using partial names has a negative effect on performance. In addition, a partial assembly name can load an assembly from the global assembly cache only if there is an exact copy of the assembly in the application base directory (BaseDirectory or AppDomainSetup.ApplicationBase).

Больше информации о том, как CLR Зонды для Ассамблей можно найти здесь: http://msdn.microsoft.com/en-us/library/aa720133.aspx

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