2
using System;
using System.IO;
using System.Reflection;
using System.Text;
using MyApp.Logging;

namespace MyApp.SmsService.Common
{
    public class MyAppAppDomain:MarshalByRefObject
    {
        private readonly AppDomainSetup domaininfo;
        private readonly AppDomain appDomain;
        public static string libDllPath;

        public MyAppAppDomain(string appDomainName) //Constructor
        {
            //Setup the App Domain Parameters
            domaininfo = new AppDomainSetup();
            domaininfo.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            domaininfo.DisallowBindingRedirects = false;
            domaininfo.DisallowCodeDownload = true;
            domaininfo.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

            // Create the application domain.
            appDomain = AppDomain.CreateDomain(appDomainName, null, domaininfo);

            //Set the dll path using Static class ref.

            //Dependency resolution handler
            appDomain.AssemblyResolve += LoadFromLibFolder; /*Exception*/
        }

        private static Assembly LoadFromLibFolder(object sender, ResolveEventArgs args)
        {

            if (libDllPath != null)
            {
                string assemblyPath = Path.Combine(libDllPath, new AssemblyName(args.Name).Name + ".dll");

                if (File.Exists(assemblyPath) == false)
                {
                    return null;
                }
                Assembly assembly = Assembly.LoadFrom(assemblyPath);
                //Assembly dependancy resolved.

                return assembly;
            }

            return null;
        }

        public Object getNewInstanceOf(string fullyQualifiedTypeName)
        {
            return appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, fullyQualifiedTypeName);
        }

        public Type getTypeOf(string fullyQualifiedTypeName)
        {
            return getNewInstanceOf(fullyQualifiedTypeName).GetType();
        }

        public void unloadDomain()
        {
            AppDomain.Unload(appDomain);
        }
    }
}

上面的类是一个包装器,我想创建它来设置和拆除应用程序域。但是,在我的网络服务中,每当我实例化 MyAppAppDomain 的对象时,我都会收到 FileNotFoundException [Failed to load a dll xyz.dll]。

以下是前任:

MyAppAppDomain.libDllPath = appDllLibPath; //Some directory other than bin.
pluginDomain = new MyAppAppDomain("SmsServicePlugins"); //Throws FileNotFoundException.

当我调试时,我看到导致异常的行是上面标记为/异常/的行,在 MyAppAppDomain 的构造函数中。

出了什么问题?

编辑:

我正在浏览其他文章,我读到对象不能跨域可见。只有当对象可以在两个域中序列化(使用 MarshalByRefObject)然后可以通过代理访问时,才会发生这种情况。

如果有人能指出上述代码中的问题,将会有很大帮助。与此同时,我正在尝试更多地了解 Marshalling 和 Proxy-ing。

4

1 回答 1

0

第一个问题是你试图在应用程序域包装器中做所有事情,它实际上是两个不同的组件。您需要的第一个组件是您想要在继承自MarshalByRefObject(或标记为Serializable)的新应用程序域中创建的对象。另一个生活在您当前的内部AppDomain,用于创建新的AppDomain.

查看 msdn示例以了解我的意思。

但是,您的错误很可能是您的 DLL 路径错误。您能否显示完整的堆栈跟踪以显示引发异常的行?

于 2012-06-14T13:42:49.463 回答