将值从其他应用程序域传递到主(主)应用程序域

时间:2015-12-01 07:16:23

标签: c# reflection appdomain remoting

通过此post,我可以将dll加载到应用程序域中并获取该dll中的类型,并根据需要将其打印在临时域的功能中。但我现在想要将这些类型传递回主域(具有Main)。我发现this thread说我需要将我的对象包装在MarshalByRef类的类中并将其作为参数传递,我尝试了但是我得到了一个异常。这是我所拥有的(在第一个链接线程中由@Scoregraphic给出的示例稍作修改)

    public class TypeListWrapper : MarshalByRefObject
    {
            public Type[] typeList { get; set; }
    }

    internal class InstanceProxy : MarshalByRefObject
    {
        public void LoadLibrary(string path, TypeListWrapper tlw)
        {
            Assembly asm = Assembly.LoadFrom(path);

            var x = asm.GetExportedTypes();//works fine

            tlw.typeList = x;//getting exception on this line
        }
    }

    public class Program
    {

        public static void Main(string[] args)
        {
            string pathToMainDll = Assembly.GetExecutingAssembly().Location;
            string pathToExternalDll = "/path/to/abc.dll";

            try
            {
                AppDomainSetup domainSetup = new AppDomainSetup
                {
                    PrivateBinPath = pathToMainDll 
                };
                AppDomain domain = AppDomain.CreateDomain("TempDomain", null, domainSetup);
                InstanceProxy proxy = domain.CreateInstanceFromAndUnwrap(pathToMainDll , typeof(InstanceProxy).FullName) as InstanceProxy;
                TypeListWrapper tlw = new TypeListWrapper();
                if (proxy != null)
                {
                    proxy.LoadLibrary(pathToExternalDll , tlw);
                }


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

            Console.ReadLine();
        }
    }

我得到例外:

  

无法加载文件或程序集' abc,   Version = 1.0.0.5,Culture = neutral,PublicKeyToken = null'或者一个   它的依赖关系。系统找不到指定的文件。

如果我从函数中删除了tlw参数并删除了这个赋值,它就可以了。我完全不知道这件事。

1 个答案:

答案 0 :(得分:1)

任何privatebinpath必须是任何应用程序域基本路径的子目录。您没有设置子应用程序域基本路径,因此它可能正在使用当前的应用程序域基本路径。我猜猜abc.dll的路径不在父bin文件夹的子目录中