ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

删除CodeDomProvider创建的程序集时访问被拒绝?

2019-12-08 11:05:18  阅读:212  来源: 互联网

标签:access-denied file-io delete-file dynamic-compilation c


如果在编译完成后在.NET中使用CodeDomProvider类,则无法删除输出程序集.我希望能够删除输出程序集. File.Delete返回拒绝访问的异常.

string asmPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N") + ".exe");
string keyPath = "some path to a *.snk file that works";
// build compiler
CodeDomProvider dom = CodeDomProvider.CreateProvider("VisualBasic");
CompilerParameters cp = new CompilerParameters();
cp.TreatWarningsAsErrors = false;
cp.GenerateInMemory = false;
cp.GenerateExecutable = true;
cp.CompilerOptions = "/target:winexe /keyfile:\"" + keyPath + "\"";
cp.OutputAssembly = asmPath;
// add all the other assembly references
string netPath = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\";
cp.ReferencedAssemblies.Add(netPath + @"System.dll");
cp.ReferencedAssemblies.Add(netPath + @"System.Core.dll");
cp.ReferencedAssemblies.Add(netPath + @"System.Data.dll");
cp.ReferencedAssemblies.Add(netPath + @"System.Xml.dll");
CompilerResults cr = dom.CompileAssemblyFromSource(cp, new string[] { code });
if (cr.Errors.Count == 0)
{
    cr.TempFiles.Delete();
    dom.Dispose();
// do stuff
...
//
    File.Delete(asmPath); // fails here Access Denied
}

编辑作为一种变通办法,我在类上使用静态构造函数来搜索temp文件夹并删除以前创建的程序集.

解决方法:

我怀疑问题在于程序集已加载(在内存中)并打开了输出文件,就像当前加载的任何其他程序集都具有其可执行文件的句柄一样.

dom实例或CompilerResults实例也有可能对打开的文件进行引用(尽管我认为不太可能).两者都不是IDisposable,因此我怀疑他们没有将文件保持打开状态.

可能的解决方案:

您可以将程序集编译到内存中.也就是说,不输出文件.这就解决了眼前的问题.但是,仍然存在编译后的程序集保留在内存中的问题.没有拆卸应用程序域就无法卸载程序集的方法.

您可以创建一个单独的应用程序域来进行编译,然后将结果传达回您的主应用程序域.然后,您可以关闭编译器应用程序域,这将从内存中删除已编译的程序集,并释放引用您刚刚创建的文件的所有文件句柄.然后,您的主程序可以删除相关文件.

标签:access-denied,file-io,delete-file,dynamic-compilation,c
来源: https://codeday.me/bug/20191208/2091176.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有