c++DLL
-
hi
ich habe 2 DLL, eine reine .net-dll und eine c++dll diese verwendet die .net.dll.
Die zwei DLL befinden sich in einen Ordner,
wenn ich nun die c++ dll von einem Programm ausführe
bzw. auf Schnittstellen der DLL zugreife kracht es leider
sobald die c++dll auf die .net zugreifen möchte.
Ich vermute es liegt daran, dass die EXE-Datei sich nicht im selben Ordner befindet wie
die 2 DLL somit kann die c++DLL die .net Datei nicht mehr finden da sie ja im Ordner von der Exe quasi ausgeführt wird.
Gibt es da irgendwelche Möglichkeiten den richtigen Pfad zu ermitteln?
Wenn ich die dlls mit zu der EXE kopiere funktioniert es
zwar aber dll sollen leider dort nicht liegen.
grueße :schland:
-
Poste bitte die exakte Fehlermeldung.
Simon
-
ein FileNotFoundException die als Dateinamen die DLL enthält.
-
Ja, dann zeigmal ein wenig Code.
Wo wird die Exception geworfen? Wie bindest Du die DLL ein?Ich nehme an, bei der .NET Dll handelt es sich um eine gemischte und keine reine .NET Dll.
Simon
-
Da hilft AssemblyResolver:
static Assembly^ MyResolveEventHandler( Object^ sender,ResolveEventArgs^ args ) { //Console::WriteLine( "Resolving..." ); Assembly^ thisAssembly = Assembly::GetExecutingAssembly(); System::String^ thisPath = thisAssembly->Location; System::String^ directory = Path::GetDirectoryName(thisPath); System::String^ pathToManagedAssembly = Path::Combine(directory, "Test.dll"); Assembly^ newAssembly = Assembly::LoadFile(pathToManagedAssembly); return newAssembly; } ... AppDomain^currentDomain=AppDomain::CurrentDomain; currentDomain->AssemblyResolve += gcnew ResolveEventHandler(MyResolveEventHandler );
-
@zeusosc spitzenmäßig genau was ich gesucht habe
Problem gelöst vielen dank !
grüße
:schland:
-
hi,
noch mal nen kleine Frage:
angenommen ich habe in in der c++ dll eine managed Klasse
die einen Member hat vom Typ der in der reinen .net_dll definiert wird.
Nun erzeuge ich mir eine Instanz von der ManagedKLasse und im Konstruktor
dieser Klasse initialisiere ich das Resolver gedöns.
Jetzt ist mir aufgefallen, dass die DLL abschmiert,
wenn ich im Konstruktor nach dem Resolv zeugs Objekte
initialisieren möchte die aus der .Net-Klasse kommen.
Wenn ich das in eine separate Funktion auslager klappt alles
wie gewünscht, weil da wohl der ResovlerHander anschlägt.
hier mal kleines code beispiel:static AssemblyUtilities::AssemblyUtilities() { mInterfaceInitialized = false; System::AppDomain^ currentDomain = System::AppDomain::CurrentDomain; currentDomain->AssemblyResolve += gcnew System::ResolveEventHandler(MyResolveEventHandler ); externMembersInit(); // mExportObj = gcnew XmlExport(); } void AssemblyUtilities::externMembersInit() { mExportObj = gcnew XmlExport(); }
eigentlich von der Sache her kein Problem, dass ich es Auslager
aber ich fände es halt schöner im Konstructor zu initialisieren
,dass ist wahrscheinlich nicht drin ? Oder gibts da noch ne Möglichkeit
grüße :schland:
-
... denn sie wissen nicht was sie tun ...
-
theta schrieb:
... denn sie wissen nicht was sie tun ...
inwiefern ?