如何从AppDomain Assembly.LoadFrom返回反射对象

时间:2015-11-27 12:03:17

标签: c# reflection .net-assembly appdomain

我需要在一个进程中从两个版本的dll返回对象。我这样做彼此不兼容,我想在一个进程中连接到两种类型的MS WHQL服务器。 我正在尝试使用它:

namespace AppDomainTester
{
    public class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            string pathToDll = Assembly.GetExecutingAssembly().Location;
            string HCKpath = Path.Combine(Path.GetDirectoryName(pathToDll), @"WhqlDlls\HCK",
                @"microsoft.windows.kits.hardware.objectmodel.dbconnection.dll");
            string HLKpath = Path.Combine(Path.GetDirectoryName(pathToDll), @"WhqlDlls\HLK",
                @"microsoft.windows.kits.hardware.objectmodel.dbconnection.dll");
            try
            {
                object hck;
                object hlk;
                // HCK 
                AppDomainSetup domainSetupHck = new AppDomainSetup
                {
                    PrivateBinPath = pathToDll
                };
                AppDomain domainHck = AppDomain.CreateDomain("HCK", null, domainSetupHck);
                InstanceProxy proxyHck =
                    domainHck.CreateInstanceFromAndUnwrap(pathToDll, typeof (InstanceProxy).FullName) as InstanceProxy;
                if (proxyHck != null)
                {
                    object obj = new object();
                    hck = proxyHck.LoadLibrary(HCKpath, "tfs13-com-hck1");
                }
                //HLK
                AppDomainSetup domainSetupHlk = new AppDomainSetup
                {
                    PrivateBinPath = pathToDll
                };
                AppDomain domainHlk = AppDomain.CreateDomain("HLK", null, domainSetupHlk);
                InstanceProxy proxyHlk =
                    domainHck.CreateInstanceFromAndUnwrap(pathToDll, typeof (InstanceProxy).FullName) as InstanceProxy;

                if (proxyHlk != null)
                {
                    object obj = new object();
                    hlk = proxyHlk.LoadLibrary(HCKpath, "tfs13-com-hck1");
                }
                //var some = domainHck.GetAssemblies();

                AppDomain.Unload(domainHck);
                AppDomain.Unload(domainHlk);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
            }

        }
    }

    internal class InstanceProxy : MarshalByRefObject
    {

        private object obj;

        public object LoadLibrary(string path, string controller)
        {
            Assembly asm = Assembly.LoadFrom(path);
            Type[] types = asm.GetExportedTypes();
            Type type =
                types.FirstOrDefault(
                    t =>
                        (t.FullName == "Microsoft.Windows.Kits.Hardware.ObjectModel.DBConnection.DatabaseProjectManager"));
            if (type != null)
            {
                var constructor = type.GetConstructors().Single(x => x.GetParameters().Length == 1);
                obj = constructor.Invoke(new[] {controller});
                //
                return obj;
                //
            }
            return null;
        }
    }
}

我想从obj方法返回LoadLibrary,但如果我尝试return obj;,我会收到异常:( 我做错了什么?

编辑1

  

类型   'Microsoft.Windows.Kits.Hardware.ObjectModel.DBConnection.DatabaseProjectManager'   在程序集'Microsoft.Windows.Kits.Hardware.ObjectModel.DBConnection中,   Version = 1.4.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'是   没有标记为可序列化。

0 个答案:

没有答案