如果文件被重命名或移动,则在其他AppDomain下加载程序集失败

时间:2018-07-26 10:48:30

标签: c# .net-assembly .net-2.0

这是一个简单的程序,用于说明我的计算机上的问题。

class Program
{
    static void Main()
    {
        string fileName = "MyApp.exe";
        string dllPath = Path.Combine(Environment.CurrentDirectory, fileName);

        AppDomainSetup domaininfo = new AppDomainSetup
        {
            ApplicationBase = AppDomain.CurrentDomain.BaseDirectory
        };
        Evidence evidence = new Evidence(AppDomain.CurrentDomain.Evidence);
        AppDomain domain = AppDomain.CreateDomain("Test domain", evidence, domaininfo);

        ProxyAssemblyLoader loader = (ProxyAssemblyLoader) domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(ProxyAssemblyLoader).ToString());

        Assembly assb = loader.LoadAssembly(dllPath);

        Console.WriteLine(assb.Location);

        AppDomain.Unload(domain);
    }
}

public class ProxyAssemblyLoader : MarshalByRefObject
{
    public Assembly LoadAssembly(string assemblyPath)
    {
        return Assembly.LoadFile(assemblyPath);
    }
}

MyApp.exe是我要测试的一些最小的.NET应用程序。在我重命名或移动二进制文件之前,它对我来说工作正常,然后程序(使用新文件名/路径更新)在LoadAssembly上显示异常,指示

  

无法加载文件或程序集“ MyApp,版本= 1.0.0.0,区域性=中性,公共密钥令牌=空”或其依赖项之一。该系统找不到指定的文件。   文件名:“ MyApp,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空”

当我不尝试将其加载到新的appdomain中时,当然不会发生这种情况。融合日志表明它仍在尝试加载旧的原始文件名:

  

LOG:此绑定在默认的加载上下文中启动。

     

日志:找不到应用程序配置文件。

     

日志:使用C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ config \ machine.config中的计算机配置文件。

     

日志:目前未将策略应用于引用(私有,自定义,部分或基于位置的程序集绑定)。

     

日志:尝试下载新的URL文件:/// C:/Program/MyApp.exe。

     

日志:尝试下载新的URL文件:/// C:/Program/MyApp/MyApp.DLL。

     

日志:尝试下载新的URL文件:/// C:/Program/MyApp.EXE。

     

日志:尝试下载新的URL文件:/// C:/Program/MyApp/MyApp.EXE。

这让我发疯,我在做什么错了?

更广泛的上下文是我希望能够加载任意.NET程序集(不一定是我的)以查看自定义属性并能够卸载它们(因此该文件未锁定并且没有内存建立)。问题是它由于上述神秘原因而失败。除了以上内容(包括ShadowCopyFiles),我已经尝试了很多,并且始终遇到相同的问题。

也欢迎提出横向解决方案。

我需要它才能在.NET 2中工作。

0 个答案:

没有答案