使用 CodeDom 编译器时缺少添加的引用
Missing Added Reference When Using CodeDom Compiler
我发现了与此类似的问题,但还没有找到专门解决我的问题的问题。
我有一些代码可以通过 System.CodeDom.Compiler
编辑 Excel 工作簿。这很重要,因为我希望以后能够 'plug-in' 对不同的工作簿进行不同的编辑说明。
在 visual studio 中使用 References>Add... 将对 Microsoft.Office.Interop.Excel.Dll 的引用添加到我的项目中,并且我已经为 CodeDom 编译器添加了对 excel dll 的引用,使用.ReferencedAssemblies.Add
如下:
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");
但不幸的是,出现了这个错误:
{error CS0006: Metadata file 'Microsoft.Office.Interop.Excel.Dll' could not be found}
有没有简单的方法告诉 CodeDom 编译器找到这个 dll?
我试过compilerParams.ReferencedAssemblies.Add(typeof(Microsoft.Office.Interop.Excel.Application).Assembly.Location);
和suggested elsewhere一样,但这只指向编译后的程序exe,而不是所需的dll。
谢谢,乔。
这可能不是答案,但评论太多了,可以作为 "workaround" 提供帮助。
我设法加载了 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
我发现了与此类似的问题,但还没有找到专门解决我的问题的问题。
我有一些代码可以通过 System.CodeDom.Compiler
编辑 Excel 工作簿。这很重要,因为我希望以后能够 'plug-in' 对不同的工作簿进行不同的编辑说明。
在 visual studio 中使用 References>Add... 将对 Microsoft.Office.Interop.Excel.Dll 的引用添加到我的项目中,并且我已经为 CodeDom 编译器添加了对 excel dll 的引用,使用.ReferencedAssemblies.Add
如下:
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");
但不幸的是,出现了这个错误:
{error CS0006: Metadata file 'Microsoft.Office.Interop.Excel.Dll' could not be found}
有没有简单的方法告诉 CodeDom 编译器找到这个 dll?
我试过compilerParams.ReferencedAssemblies.Add(typeof(Microsoft.Office.Interop.Excel.Application).Assembly.Location);
和suggested elsewhere一样,但这只指向编译后的程序exe,而不是所需的dll。
谢谢,乔。
这可能不是答案,但评论太多了,可以作为 "workaround" 提供帮助。
我设法加载了 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