我正在使用.NET反射来检查程序集的内容。不幸的是,在检查由我的程序集引用但在其他地方定义的类型时,这并不是那么简单。
所以,说我有两个Assembly
:
Assembly assembly1 = Assembly.LoadFrom("MyAssembly.dll");
Assembly assembly2 = Assembly.LoadFrom("MyReferencedAssembly.dll");
在assembly1
中,assembly2
中定义了类型,因此我想要的是基本上将assembly2
加载到assembly1
。
如何以编程方式实现此目标?
AppDomain.Load
正如评论中所建议的那样,我正在尝试这个:
private Assembly GetAssembly()
{
string[] referencedAssemblyPaths = new[] { "MyReferencedAssembly.dll" };
var domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = Environment.CurrentDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
var domain = AppDomain.CreateDomain("AssemblyContextDomain", adevidence, domaininfo);
Assembly assembly = domain.Load(LoadFile("MyAssembly.dll"));
foreach (var path in referencedAssemblyPaths)
{
domain.Load(LoadFile(path));
}
return assembly;
}
private static byte[] LoadFile(string filename)
{
FileStream fs = new FileStream(filename, FileMode.Open);
byte[] buffer = new byte[(int)fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
return buffer;
}
但是,当我得到domain.Load(LoadFile("MyAssembly.dll"))
时,我在调用FileNotFoundException
时遇到了问题:
无法加载文件或程序集' MyAssembly,Version = 10.0.0.0,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。系统找不到指定的文件。
调试信息通过调试我可以看到文件存在于正确的位置,LoadFile
成功返回流。问题出在AppDomain.Load
,它会引发异常。
我该怎么装载装配及其装饰?