我有一些正在运行的代码,并在运行时生成了接口的实现。我正在尝试使用CSharpCodeProvider
,但是当我尝试编译具有从运行应用程序中实现界面的类实现界面的代码(在Visual Studio中以调试模式运行(时,它会引发一个例外:
"找不到类型或命名空间名称'testcodegen'(您是否缺少使用指令或汇编引用?("
我的代码:
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Web.Http;
using Microsoft.CodeDom.Providers.DotNetCompilerPlatform;
namespace TestCodeGen
{
public class TestApp
{
public static void Main(string[] args)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.OutputAssembly = "MyImpl";
CompilerResults results = provider.CompileAssemblyFromSource(
parameters,
@"
using TestCodeGen;
public class MyImpl : IInterface
{
public string GetName()
{
return ""test"";
}
}
"
);
IInterface impl = (IInterface) Activator.CreateInstance(null, "MyImpl");
System.Diagnostics.Debug.WriteLine(impl.GetName());
}
}
public interface IInterface
{
string GetName();
}
}
如何添加对接口及其名称空间的引用?有什么方法可以使用parameters.ReferencedAssemblies.Add("WHAT_GOES_HERE?");
?
您需要向包含IInterface
的汇编添加引用。您可以使用typeof(IInterface).Assembly.Location
。
要创建一个MyImpl
的实例,您首先需要使用results.CompiledAssembly.GetType("MyImpl")
using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
public class TestApp
{
public static void Main(string[] args)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.OutputAssembly = "MyImpl";
parameters.ReferencedAssemblies.Add(typeof(IInterface).Assembly.Location);
CompilerResults results = provider.CompileAssemblyFromSource(
parameters,
@"
public class MyImpl : IInterface
{
public string GetName()
{
return ""test"";
}
}
"
);
var myImplType = results.CompiledAssembly.GetType("MyImpl");
IInterface impl = (IInterface)Activator.CreateInstance(myImplType);
System.Diagnostics.Debug.WriteLine(impl.GetName());
}
}
public interface IInterface
{
string GetName();
}