views:

44

answers:

1

I have an AppDomain that I'm using to load modules into a sandbox with:

class PluginLoader
{
    public static AppDomain PluginSandbox;

    static PluginLoader()
    {
        AppDomainSetup ads = new AppDomainSetup();
        ads.ApplicationName = "Plugin Modules";
        PermissionSet trustedLoadFromRemoteSourceGrantSet = 
                     new PermissionSet(PermissionState.Unrestricted);
        PluginSandbox = 
                     AppDomain.CreateDomain("Plugin App Domain", 
                     null, ads, trustedLoadFromRemoteSourceGrantSet);
     }

And then later on, I'll pull in the DLL I need and create an object instance:

     public IPlugin FindPlugin(string pluginName)
     {
          ObjectHandle handle = 
                   PluginSandbox.CreateInstance(pluginName, 
                       "Plugins." + pluginName);
                IPlugin ip = (IPlugin)handle.Unwrap();
                return ip;
     }

I run through this a couple of times with no problems. Getting instances of various objects out in the Sandbox, with no problems.

A bit later in the code, in another method, I need to find the assembly to get an embedded resource (a compiled in data file, with ManifestResource). So I call:

     Assembly [] ar = PluginSandbox.GetAssemblies();

And the error gets thrown:

A first chance exception of type 'System.IO.FileNotFoundException' 
occurred in PluginRunner.dll.

Additional information: Could not load file or assembly '10wl4qso,
Version=1.0.3826.25439, culture info=neutral, PublicKeyToken=null'
or one of its dependencies.  The system cannot find the file specified.

I'm not surprised. '10wl4qso' isn't the name of the assembly, the dll, or anything like it. In fact it seems pseudo-random for each run. Plus the added fun of GetAssemblies isn't even documented to throw this exception.

Now I can call GetAssemblies right after I get the initial object just fine, and everything is peachy. But a couple of seconds later, in a different method I get this. Being remoted, PluginSandbox has no useful information at all in the debugger.

I'm catching UnhandledException and DomainUnload on the AppDomain and neither is being triggered.

Why does my AppDomain suddenly not know about its assemblies? Where's that garbage data coming from? What can I do to prevent either/both of these from happening?

+1  A: 

This weird named assembly you're seeing is probably generated by XmlSerializer. The XML serializer will output a dynamic assembly to be able to quickly serialize and deserialize a specific type quickly. Check your code for uses of XmlSerializer, comment them out and see if the problem occurs again.

Julien Lebosquain
I looked, and don't have any serializers being used except those that might be in use under the remoting proxy -- and those aren't mine. Even if I had found one, I'm still not buying this as an explanation as to why my AppDomain is getting trashed.
clintp