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?
Hi,
probier mal
app.CreateInstanceFromAndUnwrap (AssemblyName.GetAssemblyName (Assembly.GetAssembly (typeof (WiWQuery)).Location).Name, typeof(WiWQuery).FullName)
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.
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...
Habe ich auch schon bereits versucht. Trotzdem habe ich weiterhin das Problem.
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...
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.
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...
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