Laden...

Assembly in a new AppDomain

Erstellt von brainwave vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.442 Views
brainwave Themenstarter:in
436 Beiträge seit 2007
vor 15 Jahren
Assembly in a new AppDomain

Hallo zusammen,

folgendes Problem:

Ich habe eine Assembly (WiWQuery.dll):


namespace WiWQuery
{
   [Serializable()]
    class WiWQuery
    {
       public void Test() { MessageBox.Show("Test"); }
    }

    class Loader  
    {
        public void Load()
        {
        System.AppDomain app = System.AppDomain.CreateDomain("NewApplicationDomain");
            WiWQuery wiw = (WiWQuery)app.CreateInstanceFromAndUnwrap("WiWQuery.dll", "WiWQuery.WiWQuery");
            wiw.Test();
            AppDomain.Unload(NewAppDomain);
         }
    }
}

..und eine VBScript Datei (run.vbs)


set obj = CreateObject("WiWQuery.Loader")
obj.Load
set obj = nothing

Nun, wenn ich versuche die VBS-Datei zu starten, bekomme ich folgende
Meldung: "Der Typ für Member "WiWQuery.WiWQuery, WiWQuery, Version=... wurde nicht aufgelöst".

Wenn ich aber statt ne DLL eine EXE generiere und im Studio direkt ausführe,
funktioniert alles wunderbar (inkl. Main-Methode versteht sich natürlich)

Woran liegt das?

S
902 Beiträge seit 2007
vor 15 Jahren

muss die klasse public sein?

mfg
serial

brainwave Themenstarter:in
436 Beiträge seit 2007
vor 15 Jahren

Die Klassen sind Public. Ist nur ein Pseudocode.

M
1.439 Beiträge seit 2005
vor 15 Jahren

Hi,
probier mal


app.CreateInstanceFromAndUnwrap (AssemblyName.GetAssemblyName (Assembly.GetAssembly (typeof (WiWQuery)).Location).Name, typeof(WiWQuery).FullName)

brainwave Themenstarter:in
436 Beiträge seit 2007
vor 15 Jahren

Die Datei oder Assembly file:///...\WiWQuery\WiWQuery\bin\Release\WiWQuery oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

3.971 Beiträge seit 2006
vor 15 Jahren

Zum Erstellen einer AppDomain (Plugin beispielsweise) empfiehlt es sich die AppDomainSetup-Klasse zu verwenden, da man über die Klasse mehr an der AppDomain einstellen kann.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

brainwave Themenstarter:in
436 Beiträge seit 2007
vor 15 Jahren

Habe ich auch schon bereits versucht. Trotzdem habe ich weiterhin das Problem.

3.971 Beiträge seit 2006
vor 15 Jahren

Dann häng dich zusätzlich an AppDomain.TypeResolve und debugge welche Assemblies fehlen oder in einer falschen Version vorliegen.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

brainwave Themenstarter:in
436 Beiträge seit 2007
vor 15 Jahren

Ich weiß welche Assemblies fehlen. Kopiere ich die Files in das System32 Verzeichnis, klappt alles wunderbar, da meine AppDomain die Wscript.exe ist und die befindet sich im System32. Ich muss der AppDomain sagen können,
wo er sonst nach Assemblies nachschauen soll.

3.971 Beiträge seit 2006
vor 15 Jahren

CLR sucht Assemblies im Gac, im Anwendungsverzeichnis der AppDomain und in der Config-Datei angegebenen Probing-Werten (Nur Unterverzeichnisse vom Anwendungsverzeichnis). Alles andere musst du selbst über TypeResolve laden.

Als alternative kannst du dir eine Wrapper Assembly basteln, die in deinem Anwendungsverzeichnis liegt und stellvertretend wscript.exe aufruft.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

1.274 Beiträge seit 2005
vor 15 Jahren

Hätte das auch mal ein bisschen versucht, hab nur leider keine Lösung entdeckt. Hab auch nur relativ oberflächlich gesucht.

Ich glaube es liegt daran, das er dann die Assemblys die von der geladen Assembly in den eben oben beschriebenen Pfaden sucht.
Du müsstest deinen Wrapper die Ursprünglichen Pfad beibringen.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein