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 ?


Log in to reply