Из этого сообщения я могу загрузить dll в домен приложения и получить типы в этой dll и распечатать их в функции временного домена, если я хочу. Но теперь я хочу передать эти типы обратно в основной домен (у которого есть Main). Я нашел этот поток, в котором говорится, что мне нужно обернуть мой объект в тип 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 = нейтральный, PublicKeyToken = null или одну из их зависимостей. Система не может найти указанный файл.
Если я удалю аргумент tlw из функции и удалю это назначение, все будет работать нормально. Я совершенно запутался в этом.
domain.CreateInstanceFromAndUnwrap(pathToDll, typeof(InstanceProxy).FullName) as InstanceProxy
должно возвращатьnull
, потому что вы создаете экземплярInstanceProxy
из abc.dll и преобразуете его вInstanceProxy
из основной сборки. Вы уверены, что это ваш настоящий код? - person Dennis   schedule 01.12.2015path
- это путь к внешней dll, ноpathToDll
- это путь к первичному (главному) домену. И я используюpathToDll
вCreateInstanceFromAndUnwrap
. Я отредактирую имена, чтобы сделать их более значимыми. - person AzureMinotaur   schedule 01.12.2015TypeListWrapper
объект, потому что не может найти DLL, которая его содержит. Вы можете попробовать добавитьApplicationBase = AppDomain.CurrentDomain.BaseDirectory
в свойdomainSetup
. - person vesan   schedule 02.12.2015