繁体   English   中英

C#如何获取非系统程序集

[英]C# how to get non-system assemblies

我需要实例化仅在程序程序集或mscorlib中定义的对象,而不在任何其他系统程序集中定义的对象。 目前,我正在这样做:

Type type;
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
    string fullName = name + "," + assembly.FullName;
    type = Type.GetType(fullName);
    if (type != null) break;
}
if (type != null) 
    object obj = Activator.CreateInstance(type);

有没有一种方法可以优化此循环以跳过系统程序集(但不包括mscorlib)? 我需要多次打电话。

谢谢!

您可以尝试如下操作:

  loadedAssemblies = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                   where
                     assembly.ManifestModule.Name != "<In Memory Module>"                         
                     && !assembly.FullName.StartsWith("System")
                     && !assembly.FullName.StartsWith("Microsoft")
                     && assembly.Location.IndexOf("App_Web") == -1
                     && assembly.Location.IndexOf("App_global") == -1
                     && assembly.FullName.IndexOf("CppCodeProvider") == -1
                     && assembly.FullName.IndexOf("WebMatrix") == -1
                     && assembly.FullName.IndexOf("SMDiagnostics") == -1
                     && !String.IsNullOrEmpty(assembly.Location)
                   select assembly).ToList();

一旦有了“ loadedAssemblies”,就可以执行此操作。

如果您多次调用此方法,则将加载的程序集存储在变量中,这样就不必每次都查询,而只是遍历列表。

您可以调用Load()。 从备注:

http://msdn.microsoft.com/en-us/library/36az8x58.aspx

如果已经加载了所请求程序集的版本,则即使请求了其他版本,此方法也会返回已加载的程序集。

但是,在幕后,我不确定这是否比您的O(n)循环快(甚至不同)。 您可能要同时测试它们。 如果您需要为多个程序集运行此循环,那么我建议运行一次循环,然后查找您需要的所有程序集。 如果您为同一个程序集多次运行此循环,那么我建议您使用单例类型模式,在该模式下您可以一次获得引用,而不必再次查找。

如果您了解所有程序汇编,则可以对其进行汇总。 您也可以加载Mscorlib.dll,而不必遍历每个程序集。 本质上,我提议将白名单而不是黑名单。

Assembly assembly = Assembly.Load("Mscorlib.dll");

http://ondotnet.com/pub/a/dotnet/excerpt/prog_csharp_ch18/index.html?page=5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM