2016-04-26 22 views
1

Ich versuche, eine .NET-DLL (nennen Sie es B.dll), die im Grunde ein Wrapper für eine .Net-Drittanbieter ist (nennen Sie es C.dll) in C++ - MFC-Projekt. Ich habe die tlb-Datei für B.dll erstellt und bin in der Lage, dies innerhalb der MFC-App zu instanziieren und aufzurufen.MFC verwaltete Codereferenzen

Im Moment müssen alle Abhängigkeiten, B.tlb, B.dll und C.dll, im Ordner Ordner der MFC-Anwendung sein. Ich möchte und versuche, diese drei Dateien in einen Unterordner des MFC-Ausführungsordners zu kopieren.

Ich habe versucht, die "privatePath" der B.Dll-Konfigurationsdatei zu einem Unterordner, aber wie ich es verstanden habe, ist es nicht die B.Dll "PrivatePath", die gesetzt werden muss, sondern die MFC-Anwendung (die offensichtlich hasn Ich habe keine, soweit ich weiß, da es keine. NET-Anwendung ist)

Jede Hilfe wird geschätzt.

+1

Sie sind sicherlich die Maximierung DLL Hell in diesem Szenario ist es nie viel Sinn, dass. Die CLR sucht nach einer Datei somename.exe.config im selben Verzeichnis wie somename.exe. Sie können also ein '' -Element hinzufügen, um die C.dll-Datei zu finden. B.dll kann nur gefunden werden, indem Sie die Option/codebase im Befehl Regasm.exe verwenden, die Sie zum Registrieren der Assembly verwenden müssen, oder indem Sie der mfc-App ein Manifest mit einem '' -Element geben. Das Verwenden des GAC auf dem Computer des Benutzers für COM-Abhängigkeiten ist nie eine schlechte Idee. –

+0

Warum wird dieses Szenario als DLL-Hölle betrachtet? Könntest du es bitte mehr erklären? Ich kann nicht daran denken, es zu tun, ohne einen .NET-DLL-Wrapper zu erstellen und ihn als COM-Komponente zu registrieren. – ali

Antwort

0

Sie müssen nicht COM verwenden (wenn Sie es brauchen, ist meine Antwort obsolet).

Sie können Ihre eigene C++/CLI-Wrapper-DLL schreiben, die nur eine native Schnittstelle exportiert. Dann können Sie diesen nativen Wrapper aufrufen und dieser Wrapper lädt Ihre .Net-Komponente erneut direkt und führt den darin enthaltenen Code aus.

In dieser Wrapper-DLL können Sie einen ResolveEventHandler hinzufügen, wo Sie Ihre eigene Suche implementieren (vielleicht im Unterverzeichnis). Fügen Sie dies zu Ihrer CurrentDomain-> AssemblyResolve

Mit diesem Trick kommen Sie all diese COM-Sachen, und Sie haben die volle Kontrolle, wo Assemblys gesucht werden sollte, die nicht geladen werden können.

Ich habe die Lösung von here