Mam problemy z CreateInstanceAndUnwrap w tej chwili z jakiegoś powodu (pracował wcześniej).CreateInstanceAndUnwrap w innej domenie?
Mój proces to:
I dynamicznego generowania kodu i ładuje DLL z podkatalogu przez MEF. Te aplikacje następnie ładują różne części (na żądanie) z tych bibliotek DLL. Musiałem zaktualizować mój kod, aby teraz zawierał AppDomainSetup, który zawiera ścieżkę zespołu wywołującego.
Tworzę nową AppDomain poprawnie - bez problemów. Kiedy próbuję uruchomić ten kod:
object runtime = domain.CreateInstanceAndUnwrap(
typeof(CrossDomainApplication).Assembly.FullName,
typeof(CrossDomainApplication).FullName);
mam ogromne problemy - runtime (zmienna powyżej) nie może rzutować na CrossDomainApplication lub ICrossDomainApplication.
Rzeczywisty obiekt wygląda tak:
public class CrossDomainApplication : MarshalByRefObject, ICrossDomainApplication
a interfejs wygląda następująco:
public interface ICrossDomainApplication
{
void Run(CrossDomainApplicationParameters parameters);
}
a parametry wyglądać następująco:
[Serializable]
public class CrossDomainApplicationParameters : MarshalByRefObject
{
public object FactoryType { get; set; }
public Type ApplicationType { get; set; }
public string ModuleName { get; set; }
public object[] Parameters { get; set; }
}
Natywna rodzaj starcie wydaje się be MarshalByRefObject - i nie lubi konwertowania do niczego innego.
Jakieś myśli o tym, co może być nie tak?
EDIT: Tutaj jest błąd pojawia się podczas uruchamiania go jak następuje:
ICrossDomainApplication runtime = (ICrossDomainApplication)domain.CreateInstanceAndUnwrap(
typeof(CrossDomainApplication).Assembly.FullName,
typeof(CrossDomainApplication).FullName);
//Exception before reaching here
runtime.Run(parameters);
System.InvalidCastException: Nie można rzutować przezroczyste proxy do typu „Infrastructure.ICrossDomainApplication”.
Oto co domena wygląda, jak utworzyć go:
AppDomain domain = AppDomain.CreateDomain(
Guid.NewGuid().ToString(),
null,
new AppDomainSetup()
{
ApplicationBase = GetPath(),
ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,
ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
LoaderOptimization = LoaderOptimization.MultiDomainHost
});
i getPath() wygląda następująco:
private string GetPath()
{
Uri path = new Uri(Assembly.GetCallingAssembly().CodeBase);
if (path.IsFile)
{
path = new Uri(path, Path.GetDirectoryName(path.AbsolutePath));
}
return path.LocalPath.Replace("%20", " ");
}
Może być tak proste, jak CLR nie znajdujący zespołu. Nie pomiń dokumentowania * dokładnego * wyjątku, który otrzymujesz. –
Wydaje mi się, że nie dostaję żadnych wyjątków - oprócz mojego idealnego przypadku powyżej, w którym po prostu rzucam go do pożądanego typu. Załączam również programy obsługi rejestrujące wywołania zwrotne zdarzeń w aplikacji AppDomain.Current, a także w nowej domenie. Nie ma żadnych wyjątków ani wywołań zwrotnych, chyba że spróbuję rzucić to szybko. – Locke
Jest to bardzo częsty problem z wtyczkami. Masz ** dwie ** definicje dla ICrossDomainApplication. Pochodziły z * różnych * zespołów. Albo dlatego, że skopiowałeś zespół, albo dlatego, że dwukrotnie wprowadziłeś kod źródłowy. CLR traktuje je jako oddzielne i niekompatybilne typy. Musisz upewnić się, że dokładnie ten sam zestaw z jedyną i jedyną aplikacją ICrossDomainApplication zostanie załadowany do obu domen aplikacji. –