通过此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参数并删除了这个赋值,它就可以了。我完全不知道这件事。
答案 0 :(得分:1)
任何privatebinpath必须是任何应用程序域基本路径的子目录。您没有设置子应用程序域基本路径,因此它可能正在使用当前的应用程序域基本路径。我猜猜abc.dll的路径不在父bin文件夹的子目录中