CompilerParameters.ReferencedAssemblies无法加入部分程序集引用

水言木 2009-04-09 11:07:07
大家好。我想用CodeDom来动态编译一个代码。因此要设置该代码要引用的程序集,但是像System.dll,和System.Xml.dll这些都可以直接用程序集名字来加,如下:
CompilerParameters options = new CompilerParameters();
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("System.Xml.dll");
但要是加System.Linq.dll这些就不行了,必须要用绝对路径才能加进去,如果像下面这样加:
options.ReferencedAssemblies.Add("System.Linq.dll");
就会出错编译错误(是动态编译时CompilerResults.Errors中的):Metadata file "System.Linq.dll" could not be found.
而只能用绝对路径。

这是什么原因呢?跟.net framework版本有关?这些程序集不都是在GAC中么?如果CodeDom编译时不会先从GAC中找程序集,为什么引用System.dll和System.Xml.dll这些就没有问题呢?

Thanks in advance.
...全文
485 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
水言木 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 Mouhong_Lin 的帖子:]
大家好。我想用CodeDom来动态编译一个代码。因此要设置该代码要引用的程序集,但是像System.dll,和System.Xml.dll这些都可以直接用程序集名字来加,如下:
CompilerParameters options = new CompilerParameters();
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("System.Xml.dll");
但要是加System.Linq.dll这些就不行了,必须要用绝对路径才能加进去,如果像下面这样加:
opt…
[/Quote]
这个问题已经解决,是因为编译器的版本的问题,只要我手动指定CodeDom使用的编译器版本就OK了,也能支持Linq语法了。
但有一个问题,我现在只能手工指定编译器版本,如下:
CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
有没有办法让它自动使用最新版本的编译呢?(也就是不用手工指定“v3.5”)
动态调用WebService的方法类,可以不用在VS本地引用,直接动态调用即可。 样例如下: /// /// 实例化WebServices /// /// WebServices地址 /// 调用的方法 /// 把webservices里需要的参数按顺序放到这个object[]里 public static object InvokeWebService(string url, string methodname, object[] args) { //这里的namespace是需引用的webservices的命名空间,我没有改过,也可以使用。也可以加一个参数从外面传进来。 //string @namespace = "Nq.Application.WebService"; string @namespace = "client"; try { //获取WSDL WebClient wc = new WebClient(); //Stream stream = wc.OpenRead(url); Stream stream = wc.OpenRead(url + "?WSDL"); ServiceDescription sd = ServiceDescription.Read(stream); string classname = sd.Services[0].Name; ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); //ICodeCompiler icc = csc.CreateCompiler(); //设定编译参数 CompilerParameters cplist = new 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"); //编译代理类 CompilerResults cr =

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧