От тази публикация мога да заредя 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=neutral, 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