一个工程Project,一个Reff.CS文件(文件中定义了几个类,类名是固定的,但字段可能变),因为Reff.CS可能经常会变,所以Project中没有把Reff.CS包含进来,现在我要在Project中的执行阶段,先编译Reff.CS,生成一个DLL文件,然后动态地把DLL文件包含近来,通过反射取得Reff.CS中定义的那些类的类型。如果做,大家指点一下,比如说编译,如何动态地编译,不要再启动一个进程调用csc.exe编译,这样感觉很不好。
调试欢乐多
所以只有新开一个进程来编译。
以上仅个人意见。
{
System.Net.WebClient wc = new System.Net.WebClient();//通过此类传输数据和接受方法
System.IO.Stream stream = wc.OpenRead(url+"?WSDL");//读取webservice的内容
System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);//格式化xml文档
//生成客户端代理
System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();
#region 增加定义的命名空间
sdi.AddServiceDescription(sd,"","");
System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);
System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn,ccu);
#endregion //定义编译生成环境
Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译上面生成的客户端代码
System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); //编译错误的处理
if(true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
} //具体调用
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace+"."+classname,true,true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj,args);
}
catch
{
// throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace));
return null;
}
System.IO.Stream stream = wc.OpenRead(url+"?WSDL");//读取webservice的内容
System.IO.Stream stream = wc.OpenRead(url+"?WSDL");//读取webservice的内容
Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
ICodeGenerator gen = csc.CreateGenerator();
ICodeParser icp = csc.CreateParser();
if(icp == null)
{
MessageBox.Show("icp is null");
}
CodeCompileUnit ccu = new CodeCompileUnit();
using (FileStream fs = new FileStream(fspec, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader sr = new StreamReader(fs))
{
MessageBox.Show(sr.ReadToEnd().ToString());
ccu = icp.Parse(sr);
}
}
System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if(true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}MessageBox.Show(cr.Output.ToString());
System.Reflection.Assembly assembly = cr.CompiledAssembly;
MessageBox.Show(assembly.FullName.ToString());
// Type t = assembly.GetType(nameSpace + "."+ "DICOMViewerTest_OUTPUTBean", true, true);
Type[] tt = assembly.GetTypes();
foreach(Type t in tt)
{
MessageBox.Show(t.FullName);
}本来我想用ICodeParser icp = csc.CreateParser();去读取源文件,但这个接口没有实现,真的恶心,有谁知道还有没有其他的解决方案啊?