读书人

类库的编译有关问题

发布时间: 2012-01-19 20:57:59 作者: rapoo

类库的编译问题
创建了一个类库,UserInfo.cs

代码如下

C# code
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Model{    public class UserInfo    {        public virtual int ID { get; set; }        public virtual string UserID { get; set; }        public virtual string UserName { get; set; }    }}

我想动态编译它

在另外一个WinForm中,
C# code
using Microsoft.CSharp;using System.CodeDom.Compiler;using System.IO;CSharpCodeProvider objCSharpCodePrivoder=new CSharpCodeProvider();CompilerParameters paras = new CompilerParameters();paras.GenerateExecutable = false;   //编译成exe还是dll//paras.ReferencedAssemblies.Add("System.dll");paras.GenerateInMemory = false;   //是否写入内存,不写入内存就写入磁盘paras.OutputAssembly = "C:\\UserInfo.dll";  //输出路径StreamReader sr = new StreamReader(@"C:\UserInfo.cs");String txtStr = sr.ReadToEnd();CompilerResults result = objCSharpCodePrivoder.CompileAssemblyFromSource(paras, txtStr);


为什么编译不成功?result的返回值错误:
未能加载文件或程序集“file:///C:\UserInfo.dll”或它的某一个依赖项。系统找不到指定的文件。
^

怎么回事?UserInfo.dll不是应该生成出来的么?

[解决办法]
C# code
using System.Reflection; using System.Globalization; using Microsoft.CSharp; using System.CodeDom; using System.CodeDom.Compiler; private string CreateCode()         {             StringBuilder sb = new StringBuilder();             //声明需要使用的命名空间。             sb.Append("using System;");             sb.Append("using System.Collections.Generic;");             sb.Append("using System.ComponentModel;");             sb.Append("using System.Data;");             sb.Append("using System.Drawing;");             sb.Append("using System.Text;");             sb.Append("using System.Windows.Forms;");             sb.Append(Environment.NewLine);             //将需要执行的功能this.code,字符串包装到一个类的函数里面。             sb.Append("namespace DynamicCodeGenerate");             sb.Append(Environment.NewLine);             sb.Append("{");             sb.Append(Environment.NewLine);             sb.Append("    public class HelloWorld");             sb.Append(Environment.NewLine);             sb.Append("    {");             sb.Append(Environment.NewLine);             sb.Append("        public void OutPut()");             sb.Append(Environment.NewLine);             sb.Append("        {");             sb.Append(Environment.NewLine);             sb.Append(this.code);             sb.Append(Environment.NewLine);             sb.Append("        }");             sb.Append(Environment.NewLine);             sb.Append("    }");             sb.Append(Environment.NewLine);             sb.Append("}");             //将所有声明的字符串返回给编译器使用。             string code = sb.ToString();             return code;         }         private void btnRun_Click(object sender, EventArgs e)         {             CodeDomProvider _CodeDomProvider = CodeDomProvider.CreateProvider("CSharp");             //提供对 C# 代码生成器和代码编译器的实例的访问            //CSharpCodeProvider _CSharpCodePrivoder = new CSharpCodeProvider();             //定义用于调用源代码编译的接口或使用指定编译器的 CodeDOM 树             //ICodeCompiler _ICodeCompiler = _CodeDomProvider.CreateCompiler(); //_CSharpCodePrivoder.CreateCompiler();           //表示用于调用编译器的参数,将所有需要使用的DLL和EXE文件添加打参数里面。             CompilerParameters _CompilerParameters = new CompilerParameters();             _CompilerParameters.ReferencedAssemblies.Add("System.dll");             _CompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");             _CompilerParameters.ReferencedAssemblies.Add("CodeDom.exe");             _CompilerParameters.ReferencedAssemblies.Add("System.Data.dll");             _CompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll");             _CompilerParameters.GenerateExecutable = false;             _CompilerParameters.GenerateInMemory = true;             //表示从编译器返回的编译结果             //CompilerResults _CompilerResults = _ICodeCompiler.CompileAssemblyFromSource(_CompilerParameters, this.CreateCode());             //在CodeDomProvider 类中已经实现了ICodeCompiler类中的CompileAssemblyFromSource()方法,直接调用就可以了!            CompilerResults _CompilerResults =_CodeDomProvider.CompileAssemblyFromSource(_CompilerParameters, this.CreateCode());            if (_CompilerResults.Errors.HasErrors)             {                 string ErrorMessage="";                 foreach (CompilerError err in _CompilerResults.Errors)                 {                     ErrorMessage += err.ErrorText;                 }                 MessageBox.Show(ErrorMessage);             }             else             {                 // 通过反射,调用HelloWorld的实例                 Assembly _Assembly = _CompilerResults.CompiledAssembly;         //CreateInstance()从此程序集中查找某个类型,然后使用系统激活器创建它的实例                 object _HelloWorld = _Assembly.CreateInstance("DynamicCodeGenerate.HelloWorld");                 //发现方法的属性并提供对方法元数据的访问,获取OutPut()方法。                MethodInfo _MethodInfo = _HelloWorld.GetType().GetMethod("OutPut");                 //执行objMI对象中的objHelloWorld对象中的函数。                 _MethodInfo.Invoke(_HelloWorld, null);             }         } 


[解决办法]
"C:\\UserInfo.dll" 改为 "D:\\UserInfo.dll" 试试。
[解决办法]
CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeGenerator gen = provider.CreateGenerator();
StreamWriter sw = new StreamWriter("d:\\A.cs", false);ICodeGenerator gen = provider.CreateGenerator();
gen.GenerateCodeFromCompileUnit(compileunit, sw, new CodeGeneratorOptions());




[解决办法]
thank you
[解决办法]
学习了 没弄过动态的编译
[解决办法]
so de su
[解决办法]
没搞懂什么意思
[解决办法]
hao
[解决办法]
要赚钱啊
[解决办法]
好帖子
[解决办法]
早晨一来就有收获
帮顶
[解决办法]
帮顶
[解决办法]

探讨
CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeGenerator gen = provider.CreateGenerator();
StreamWriter sw = new StreamWriter("d:\\A.cs", false);ICodeGenerator gen = provider.CreateGenerator();
gen.GenerateCodeFromCompileUnit(compileunit, sw, new CodeGeneratorOptions());


[解决办法]
看看
[解决办法]
学习中
[解决办法]
学习了
[解决办法]
学习一下 谢谢
[解决办法]
学习了,MAKE

读书人网 >C#

热点推荐