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

时间:2011-03-01 20:37:42

标签: c# 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)?我需要多次打电话。

谢谢!

3 个答案:

答案 0 :(得分:5)

您可以尝试这样的事情:

  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”,你可以做你需要做的事情。

如果你多次调用它,那么将加载的程序集存储在一个变量中,这样你就不会每次都进行查询,而只是遍历列表。

答案 1 :(得分:1)

您可以调用Load()。从评论中可以看出:

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

  

如果已加载所请求程序集的版本,则此方法将返回已加载的程序集,即使请求了不同的版本。

然而,在引擎盖下,我不确定这是否比你的O(n)循环(甚至任何不同)更快。你可能想要测试它们。如果你需要为多个程序集运行这个循环,那么我建议运行一次循环并找到你需要的所有程序集。如果您为同一个程序集多次运行此循环,那么我建议使用单例类型模式,您可以在其中获取一次引用,而不再查看。

答案 2 :(得分:1)

如果你知道所有的程序集,你可以只收集它们。您还可以加载Mscorlib.dll而无需遍历每个程序集。从本质上讲,我提议白名单而不是黑名单。

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

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