如何在当前应用程序域中获取已加载或引用的程序集的名称以传递给C#编译器?

时间:2013-12-11 20:58:16

标签: .net .net-assembly codedom

我正在使用它:

AppDomain.CurrentDomain.GetAssemblies().SelectMany<Assembly,string>( a => a.GetModules().Select<Module,string>( m => m.FullyQualifiedName )).ToArray()

获取所有已加载程序集的名称。

它来自获取类型的友好C#名称的代码:

return (Type)(new CSharpCodeProvider().CompileAssemblyFromSource( new CompilerParameters( AppDomain.CurrentDomain.GetAssemblies().Select<Assembly,string>( a => a.CodeBase).ToArray(), null, false) {GenerateExecutable = false, GenerateInMemory = true, TreatWarningsAsErrors = false, CompilerOptions = "/optimize"}, "public static class C{public static System.Type M(){return typeof(" + friendlyName + ");}}").CompiledAssembly.GetExportedTypes()[0].GetMethod("M").Invoke( null, System.Reflection.BindingFlags.Static, null, null, null ));

但编译器会产生如下错误: 无法加载文件或程序集'file:/// C:\ Users {username} \ AppData \ Local \ Temp \ qk3bjlf3.dll'或其依赖项之一。系统找不到指定的文件。

问题是......该文件实际上并未在任何地方引用。它不是由AppDomain.CurrentDomain.GetAssemblies()或任何子模块返回的,每次我在调试器中单击“继续”时名称都会更改。

1 个答案:

答案 0 :(得分:0)

其实我喜欢这个:

var assemblies = new List<string>();
assemblies.AddRange(new List<string>(AppDomain.CurrentDomain.GetAssemblies()
  .Where((a) => !a.IsDynamic).Select((a) => a.CodeBase
  .Replace("file:\\", "")
  .Replace("file:///", ""))));

以防万一(因为我经常使用这个)我创建了一个小型图书馆,以此类型的东西

代码和文档在这里:Kendar Expression Builder 虽然nuget包在这里:Nuget Sharp Template