使用CodeDom编译器时缺少添加的引用

时间:2017-09-28 11:28:00

标签: c# dll system-codedom-compiler

我发现了类似的问题,但未能找到专门解决我问题的内容。

我有一些代码可以通过System.CodeDom.Compiler编辑Excel工作簿。这很重要,因为我希望能够插入'稍后针对不同工作簿的不同编辑说明。

在Visual Studio中使用References> Add ...将Microsoft.Office.Interop.Excel.Dll的引用添加到我的项目中,并使用.ReferencedAssemblies.Add为CodeDom编译器添加了excel dll的引用如下:

CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);

CompilerParameters compilerParams = new CompilerParameters();
compilerParams.GenerateInMemory = true;
compilerParams.GenerateExecutable = false;
compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.Dll");
compilerParams.ReferencedAssemblies.Add("Microsoft.Office.Interop.Excel.Dll");

但不幸的是,发生了这个错误:

  

{错误CS0006:元数据文件' Microsoft.Office.Interop.Excel.Dll'无法找到}

有没有简单的方法告诉CodeDom编译器找到这个dll?

我已经尝试compilerParams.ReferencedAssemblies.Add(typeof(Microsoft.Office.Interop.Excel.Application).Assembly.Location);作为suggested elsewhere,但这仅指向已编译的程序exe,而不是所需的dll。

谢谢,乔。

1 个答案:

答案 0 :(得分:1)

这可能不是答案,但是对于评论来说太多了,可以作为“解决方法”。

我设法加载了System.Data.dll,它不是托管程序集的一部分。我将其手动放置在正在执行的“ bin”文件夹中,仅用于测试。 我使用的错误很明显:

String pathToDll = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

获取该dll的基本目录。但是我得到了一个uri(file:/// C:/ ...)。解析为“ C:\ ...”后,一切进行顺利。

由于找不到您的dll,您可以编辑该引用的属性并设置“ CopyLocal = true”,以便该dll与.exe的路径相同。.之后,您应该可以加载它:

String pathAndFile = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;    
pathAndFile = Path.GetDirectoryName(pathAndFile);
Uri uri = new Uri(pathAndFile);
pathAndFile = uri.LocalPath + "\\" + "Microsoft.Office.Interop.Excel.Dll";
compilerParams.ReferencedAssemblies.Add(pathAndFile);

还要看一下这段代码,它应该从托管程序集中加载所有内容。 (警告:您不能在同一AppDomain中两次加载单个程序集)

var assemblies = AppDomain.CurrentDomain
                       .GetAssemblies()
                       .Where(a => !a.IsDynamic)
                       .Where(a => !parameters.ReferencedAssemblies.Contains(a.Location))
                       .Select(a => a.Location);

parameters.ReferencedAssemblies.AddRange(assemblies.ToArray());

据我所读,这两个教程有些旧(已描述的代码),但帮助我了解了一些东西:

https://west-wind.com/presentations/DynamicCode/DynamicCode.htm https://weblog.west-wind.com/posts/2016/Dec/12/Loading-NET-Assemblies-out-of-Seperate-Folders