Question

I have some code to load a exe file and shows its CIL code to user. To do it I use Mono.Cecil and Mono.Cecil.Cil.

Now I wanna do something different: I wanna know if user has Mono.Cecil and Mono.Cecil.Cil in his system. to do that I thought to use Reflection.Assembly.Load with Mono.Cecil and Mono.Cecil.Cil. Something like:

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;
    }
    //[...]
}

But I only get the following error:

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

And, of course, I have Mono.Cecil and Mono.Cecil.Cil. Am I not using properly Assembly.Load? If it's the case, can someone tell me how to use Assembly.Load to be able to load Mono.Cecil and Mono.Cecil.Cil without looking for a path ( to make an only exe file to be used under Windows or GNU/Linux with mono )?

Note: I'm working under Linux Mint with MonoDevelop 2.6 or under windows 7 with MonoDevelop 2.8.

Was it helpful?

Solution

You seem to be misunderstanding what Assembly.Load does to load the assembly. I guess what you're trying to look for is whether the user has Mono.Cecil in the GAC. The problem is thta only the search paths of the current AppDomain are searched when you supply a partial name, the GAC is only used when you supply the full name. This is documented 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).

More information on how the CLR Probes for Assemblies can be found here: http://msdn.microsoft.com/en-us/library/aa720133.aspx

This is exactly why Assembly.LoadWithPartialName() exists, but it has been deprecated.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top