Interop, Native DLL und Visual Studio Build-Prozess

8

Verwirrender Titel, verwirrende Frage, aber ich hoffe, ich kann Ihre Aufmerksamkeit bekommen. Auf den Punkt:

Ich habe eine VS-Lösung mit drei Projekten.

  1. Project1 : Ein nativer DLL-Interop-Wrapper, der Native.dll importiert.
  2. Project2 : Ein WinForms-Projekt, das Aufrufe des Wrappers von Project1 aufruft.
  3. Project3 : Ein MSTest-Projekt, das Aufrufe des Wrappers von Project1 Project2.
  4. aufruft

Ich habe native.dll in Project1 eingefügt und es so konfiguriert, dass es in den Ausgabeordner kopiert werden kann.

Diese Einstellung führt dazu, dass der DllImport fehlschlägt und sagt, dass die Ziel-DLL nicht gefunden werden konnte. Der Grund ist einfach. Ich habe entweder Projekt 2 oder 3 und jeweils:

  • Project2: Wenn es erstellt wird, kopiert es die Project1.dll, die von dem Erstellungsprozess generiert wird, kopiert jedoch Native.dll NICHT. Wenn der Code ausgeführt wird, ist der Ordner $ ProjectDir \ bin \ Debug (oder release) und die Native.dll ist nicht verfügbar.

  • Project3: Es ist ein MSTest-Projekt; Wenn Sie aufgefordert werden, alle Tests auszuführen, kompiliert es die Anwendung und kopiert die Ausgabe exe und dll in den Ausgabeordner. Es kopiert die Native.dll jedoch nicht.

In beiden Beispielen wird die DLL in den Debug-Ordner von Project1 kopiert, was nutzlos ist.

Gibt es eine einfache Möglichkeit, dieses Projekt zu korrigieren? Mit einfachen Worten, ich möchte vermeiden, Post Build zum Kopieren oder anderen manuellen Prozessen zu verwenden. Ich möchte auch versuchen zu vermeiden, einen absoluten Pfad zu verwenden, um die DLL zu kopieren.

Ich verwende Visual Studio 2010.

Danke!

UPDATE: Im obigen Szenario wurde angegeben, dass Project3 auf Project1 verweist, was nicht der Fall ist. Project3 verweist auf Project2, das auf Project1 verweist. In diesem Fall wird die Native.dll in den Ausgabeordner von Project2 kopiert, aber nicht in den Ausgabeordner von Project3. Ich habe auch ein Projekt4 des Klassenbibliothekstyps hinzugefügt, einen Verweis auf Project2 hinzugefügt und es kopiert auch nicht.

Mit anderen Worten, wenn ein Projekt P [A] ein Element X mit der Regel "Kopie zur Ausgabe" hat und ein P [B] es referenziert, kopiert P [B] auch X. Wenn jedoch ein P [C] verweist auf P [B] und ignoriert die Kopierregel.

    
Bruno Brant 27.03.2012, 23:12
quelle

1 Antwort

5

Fügen Sie einen Verweis auf "Native.dll" in Ihrem Projekt hinzu. Setzen Sie im Eigenschaftsfenster der Datei die Aktion 'Build Action' auf 'None' und 'Copy to Output Directory' auf 'Always' oder 'Copy if Newer'

    
Ritch Melton 27.03.2012 23:19
quelle

Tags und Links