问题描述
c#动态编时,如何添加现有模块的程序集的引用.如:一个解决方案下有两个模块:Controls和Comp(这里就是说有两个不同的程序集,在Comp里要用Controls里的类时,必须添一个Controls项目的引用)Controls模块有一个类baseControl在Comp模块下有,CompilerParametersvCompilerParameters=newCompilerParameters();vCompilerParameters.GenerateExecutable=false;vCompilerParameters.GenerateInMemory=true;vCompilerParameters.ReferencedAssemblies.Add("System.DLL");//添加一个dll引用vCompilerParameters.ReferencedAssemblies.Add("mscorlib.dll");//添加一个dll引用vCompilerParameters.ReferencedAssemblies.Add(typeof(Controls.baseControl).Module.FullyQualifiedName)//这里也是添加对一个dll或者exe的引用,是从硬盘文件读取的.能不从硬盘文件去获取这程序集吗?请问有更好的方法吗?//这里用到Controls里的类.stringvSource=@"......Controls.baseControlbc=newControls.baseControl();..."CompilerResultsvCompilerResults=CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(vCompilerParameters,vSource);AssemblyvAssembly=vCompilerResults.CompiledAssembly;........
解决方案
解决方案二:
能不能不去引用的是硬盘文件?各位高手给个回复呀,谢谢!
解决方案三:
up!
解决方案四:
vCompilerParameters.ReferencedAssemblies.Add(typeof(Controls.baseControl).Module.FullyQualifiedName)//这样觉得太烂了,有好的方法吗?
解决方案五:
up!
解决方案六:
用这个AppDomain.CurrentDomain.GetAssemblies();或者所有的Assembly
解决方案七:
stringfile="System";//Systemy文件的路径stringpath="System.DLL";//System.DLL文件的路径CompilerParameterscompilerparams=newCompilerParameters();compilerparams.OutputAssembly=path;CompilerResultsresults=compiler.CompileAssemblyFromFile(compilerparams,file);
解决方案八:
up
解决方案九:
我对lovefootball兄 答案的理解是:用AppDomain.CurrentDomain.GetAssemblies()返回Controls的Assembly对象。正如typeof(Controls.baseControl).Assembly。可是得到这个Assembly以后.我怎么把它添加到引用中去?
解决方案十:
引用6楼wenrenhua08的回复:
stringfile="System";//Systemy文件的路径stringpath="System.DLL";//System.DLL文件的路径CompilerParameterscompilerparams=newCompilerParameters();compilerparams.OutputAssembly=path;CompilerResultsresults=compiler.CompileAssemblyFromFile(compilerparams,file);
对于henry兄的回复,是不是把动态编辑的程序输出到硬盘文件里,我不知道这里对添加现在模块的引用是怎么处理的 ?不知道大家明白我问的什么吗?我表达能力是不是很差?
解决方案十一:
我的意思是说,我在Comp模块里动态编辑一段代码,它是一个字符串变量,只不过里存的是代码的字符,比如说 stringcode="Controls.baseControl=newControls.baseControl();";就叫它动态代码吧。而这动态代码里又使到了baseControl类。这个类在Controls模块里,Controls模块和Comp模块都在同一解决方案里,都是这个解决方案里的项目。为了动态代码能运行。就得动态编辑,动态编辑得添加对Controls模块的引用我添加引用方法是:vCompilerParameters.ReferencedAssemblies.Add(typeof(Controls.baseControl).Module.FullyQualifiedName)//这样觉得太烂了,有好的方法吗?因为在运行时,Controls模块已经在内存里,我不想再通过去读硬盘文件,来添加引用。直接对已经存在内存里的Controls模块引用。vCompilerParameters.ReferencedAssemblies.Add(stringvalue)这个value只能是文件路径吗?
解决方案十二:
CompilerParametersparameters=newCompilerParameters();Assemblyab=Assembly.GetEntryAssembly();AssemblyName[]ans=ab.GetReferencedAssemblies();foreach(AssemblyNameassemblyNameinans){stringcodeBase=assemblyName.CodeBase;if(string.IsNullOrEmpty(codeBase)){parameters.ReferencedAssemblies.Add(assemblyName.Name+".dll");continue;}stringtempFileName=codeBase.StartsWith("file://")?codeBase.Substring(8):codeBase.Substring(codeBase.LastIndexOf("/")+1);parameters.ReferencedAssemblies.Add(tempFileName);}
解决方案十三:
学习,帮顶!