在 C# 中从程序集及其依赖项创建实例

5 .net c# dependencies assemblies

我有一个应用程序(让我们称之为 MyApp),它动态地为一个类创建源代码,然后编译它。当它编译源代码时,我还引用了另一个文件夹中已经存在的另一个 DLL(即这个新创建的类的基类)。我执行以下操作来编译和输出 DLL:

//Create a C# code provider 
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

//Set the complier parameters
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = false;
cp.TreatWarningsAsErrors = false;
cp.WarningLevel = 3;
cp.OutputAssembly = "SomeOutputPathForDLL";

// Include referenced assemblies
cp.ReferencedAssemblies.Add("mscorlib.dll");
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Core.dll");
cp.ReferencedAssemblies.Add("System.Data.dll");
cp.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
cp.ReferencedAssemblies.Add("System.Xml.dll");
cp.ReferencedAssemblies.Add("System.Xml.Linq.dll");
cp.ReferencedAssemblies.Add("MyApp.exe");
cp.ReferencedAssemblies.Add("SomeFolder\SomeAdditionalReferencedDLL.dll");

// Set the compiler options
cp.CompilerOptions = "/target:library /optimize";
CompilerResults cr = provider.CompileAssemblyFromFile(cp, "PathToSourceCodeFile");
Run Code Online (Sandbox Code Playgroud)

稍后在我的应用程序中(或下次运行应用程序时),我尝试创建该类的实例。我知道新创建的类(我们称之为 Blah)的 DLL 和基类的 DLL 在哪里。我使用以下代码尝试创建新类的实例:

Assembly assembly = Assembly.LoadFile("PathToNewClassDLL");
Blah newBlah = assembly.CreateInstance("MyApp.BlahNamespace.Blah") as Blah;
Run Code Online (Sandbox Code Playgroud)

当我像上面那样调用 Assembly.CreateInstance 时,我收到一条错误消息,说它无法创建实例。当我检查 assembly.GetReferencedAssemblies() 它有标准引用和我的应用程序的引用 (MyApp.exe) 但它没有我最初编译类时使用的依赖基类的引用 (SomeAdditionalReferencedDLL.dll) .

我知道我必须以某种方式添加基类引用才能创建实例,但我不确定如何执行此操作。当我拥有程序集及其所有依赖项时,如何从程序集创建类的实例?

谢谢

Jef*_*tes 0

您确定在编译时,它引用了您认为它正在引用的 DLL 实例吗?它可能会解析到您认为的其他地方的路径,以便在实例化您的类时,它不再找到该 DLL。我建议获取编译过程和类型创建的 Fusion 日志,以了解类型是如何解析的。