ShadowCopy assemblies

本文关键字:assemblies ShadowCopy | 更新日期: 2023-09-27 18:25:51

我遇到了一个问题,我真的不知道为什么它不起作用。我读了很多教程(也是关于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))
//...

知道吗?

ShadowCopy assemblies

您可以通过以下方式加载程序集。

var types = Assembly.Load(File.ReadAllBytes("YourAssembly.dll")).GetTypes();

现在,您可以从程序集中提取类型,并且可以在应用程序仍在运行时删除程序集。