【发布时间】:2010-02-03 19:27:19
【问题描述】:
根据How the Runtime Locates Assemblies,第2步是Checking for Previously Referenced Assemblies。
但是,在下面的代码中,您可以看到这绝对不会发生。在第一行中,加载了一个程序集(这应该使其成为所有未来调用的“先前引用的程序集”。)
但是,几行之后,当代码调用 AppDomain.CurrentDomain.CreateInstance 时,会触发 AssemblyResolve 事件,表明运行时无法找到请求的程序集。
您可以知道程序集已加载,因为从 AssemblyResolve 事件 我直接从 CurrentDomain.GetAssemblies() 返回程序集!
那么,显而易见的问题是,为什么运行时没有找到引用的程序集,正如“运行时如何定位程序集”的第 2 步所暗示的那样?
为了运行此示例:创建一个新的控制台应用,然后向该解决方案添加一个新的 ClassLibrary,并将其命名为 ClassLibrary1。将以下代码粘贴到控制台应用程序的类程序中:
class Program
{
static void Main(string[] args)
{
Assembly asmbly = Assembly.LoadFile(Path.GetFullPath(@"..\..\..\ClassLibrary1\bin\Debug\ClassLibrary1.dll"));
Type firstType = asmbly.GetTypes().First();
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
object myInstance = AppDomain.CurrentDomain.CreateInstance(asmbly.FullName, firstType.FullName);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
//WHY AM I HERE?
return AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(p => p.FullName == args.Name);
}
}
然后像这样使用引用添加:
using System.Reflection;
using System.IO;
请注意,我故意将原始路径保留在此处,以便运行时不会根据Step 4: Locating the Assembly through Codebases or Probing 找到程序集我的情况是,我试图故意使用Step 2 中定义的功能.如果运行时可以通过第 4 步找到路径,那将正常工作。这是第 2 步不起作用。
谢谢。
【问题讨论】:
标签: .net reflection createinstance