我需要实例化一个仅在程序集或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)?我需要多次打电话。
谢谢!
答案 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