在什么情况下AppDomain.DoCallback()会失败?

时间:2012-09-24 12:07:47

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

我正在尝试使用AppDomain加载和卸载程序集运行时。我正在尝试在实现程序集加载之前在我的应用程序中使用MSDN上的示例,但我遇到了问题 - DoCallback - invokation失败,异常

  

无法加载文件或程序集'[MyPluginAssembly],Version = 1.0.0.0,   Culture = neutral,PublicKeyToken = null'或其依赖项之一。该   系统找不到指定的文件。

我的程序集([MyPluginAssembly])正在由主机应用程序加载(即它是一个插件)。插件AppDomain似乎是应用程序域(即它不是在单独的域中沙箱化)。我已经尝试在新域中加载entry / calling / execution-assembly以确保加载[MyPluginAssembly],但即使这些调用返回非null,我仍然会得到上面的异常。

我使用的代码(如example on MSDN +加载“父”组件的代码):

public class PingPong : MarshalByRefObject
{
    private string greetings = "PING!";

    public static void Main()
    {
        AppDomain otherDomain = AppDomain.CreateDomain("otherDomain");
        // All of these Load()-calls returns non-null
        Assembly entryAssembly = otherDomain.Load(Assembly.GetEntryAssembly().GetName());
        Assembly callingAssembly = otherDomain.Load(Assembly.GetCallingAssembly().GetName());
        Assembly executingAssembly = otherDomain.Load(Assembly.GetExecutingAssembly().GetName());

        PingPong pp = new PingPong();
        pp.MyCallBack();
        pp.greetings = "PONG!";
        otherDomain.DoCallBack(new CrossAppDomainDelegate(pp.MyCallBack));

        // Output: 
        //   PING! from defaultDomain 
        //   PONG! from defaultDomain
    }

    // Callback will always execute within defaultDomain due to inheritance from 
    // MarshalByRefObject 
    public void MyCallBack()
    {
        string name = AppDomain.CurrentDomain.FriendlyName;
        if (name == AppDomain.CurrentDomain.SetupInformation.ApplicationName)
        {
            name = "defaultDomain";
        }
        Console.WriteLine(greetings + " from " + name);
    }
}

什么情况会导致我得到的例外?

1 个答案:

答案 0 :(得分:1)

您应该查看CreateInstanceFromAndUnwrap方法。它是用于像你这样的沙盒加载方案的那个。 System.AddIn(MAF)正在使用此方法加载加载项管道段。