我有一个问题,我真的不知道为什么它不起作用。我已经阅读了很多教程(也在 stackoverflow 上),但仍然一无所获。
我的目标是在一些 .dll 文件上使用反射(它们还没有被任何程序使用)并获取继承类型、方法、构造函数等。一切正常,但问题是 dll 被锁定并且在我关闭之前无法删除该程序。这是我尝试解决问题的代码的一部分。
var apds = new AppDomainSetup();
apds.ApplicationName = "MyAssemblies";
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain apd = AppDomain.CreateDomain("newdomain", adevidence, apds);
apd.AppendPrivatePath("Assemblies");
apd.SetCachePath("C:\\Cache");
apd.SetShadowCopyFiles();
foreach (var type in apd.Load(AssemblyName.GetAssemblyName(file.Path)).GetTypes())
{
foreach (var inherits in GetInheritanceHierarchy(type))
{ //rest is ok
我知道我使用了一些不推荐使用的方法,但这是尝试之一。Dll 已成功复制到缓存目录中,但它们似乎也已加载到当前域中。问题出在哪里?提前致谢。
我修改了我的代码并使用了 Loader 类,但我仍然有锁定的文件。
class Loader : MarshalByRefObject
{
public Assembly assembly;
public void LoadAssembly(string path)
{
assembly = Assembly.Load(AssemblyName.GetAssemblyName(path));
}
public Types[] getTypes()
{
return assembly.getTypes();
}
}
//...
if (file.Type == ".dll")
{
var apds = new AppDomainSetup
{
ApplicationName = "MyAssemblies",
ApplicationBase = Path,
ShadowCopyFiles = "true",
ShadowCopyDirectories = Path
};
AppDomain apd = AppDomain.CreateDomain("newdomain", null, apds);
Loader loader = (Loader)apd.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName);
loader.LoadAssembly(file.Path);
foreach (var type in loader.getTypes())
{
foreach (var inherits in GetInheritanceHierarchy(type))
//...
任何想法?