Rickless
Rickless

Reputation: 1455

System.ArgumentException Invalid file name in Assembly.LoadModule(string,byte[])

During my studies of reflection, I have encountered the .net module.

I understand that means I can compile a single class as .net module (correct me if I wrong) then load this compiled .net module using Assembly.LoadModule(string,byte[]).

I wrote a class that look like this:

using System;
using System.Text;

public class Mycs {
    public static string GiveString(){
        return "Hello World !";
    }
}

and compiled it using the switch "/target:module" using this code:

CodeDomProvider CDP = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters CP = new CompilerParameters();
CP.GenerateExecutable = false;
CP.CompilerOptions = "/target:module";
CP.OutputAssembly = FilePathText.Text.Replace(Strings.Right(FilePathText.Text, 3), ".netmodule");
string source = File.ReadAllText(FilePathText.Text);
CompilerResults RS = CDP.CompileAssemblyFromSource(CP, source);

I then retrieved the resulted file bytes:

byte[] b = File.ReadAllBytes(FilePathText.Text);

And finally I tried to load the module to the current executed assembly:

Module[] Modules = Assembly.GetExecutingAssembly().GetModules();
Module[] moduless = Assembly.GetExecutingAssembly().GetLoadedModules();
Module A = Assembly.GetExecutingAssembly().LoadModule(Modules[0].Name, b);

Whether I passed the Modules[0].Name or moduless[0].Name both cause this exception:

An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll Additional information: Invalid file name

Why do I get this invalid file name error?

Upvotes: 0

Views: 1054

Answers (1)

Sergey Baranchenkov
Sergey Baranchenkov

Reputation: 624

You cannot load dynamically created module to an existing assembly, assemblies once compiled are immutable.

My best guess is that you need to use AssemblyBuilder.DefineDynamicModule() to create your classes in it. In this case you the type you created will be loaded automatically. or compile your classes as assemblies, not the modules, and load those assemblies dynamically using Assembly.LoadFile method.

Upvotes: 1

Related Questions