2017-02-09 1 views
0

Ich baue ein Projekt in C#, um mit einer C++ - Bibliothek zu interagieren. Weil ich will, dass dies plattformübergreifend ist, verwende ich .NET Core RC3, obwohl ich nicht sicher bin, ob das relevant ist.Wie kann ich eine native DLL als Teil eines .NET-Buildprozesses erstellen?

Im Moment habe ich die CPP-Dateien in meinem Projekt, und ich habe eine PreBuildEvent wie

<PreBuildEvent> 
    gcc -c -fPIC -std=c++11 "$(SolutionDir)ProjectName\cfile.cpp" -o"$(SolutionDir)ProjectName\cfile.o" 
    gcc -shared -o "$(SolutionDir)ProjectName\cfile.dll" "$(SolutionDir)ProjectName\cfile.o" -lstdc++ 
</PreBuildEvent> 

Die DLL gebaut werden, und dann in das Ausgabeverzeichnis kopiert. Dann benutze ich PInvoke, um damit zu kommunizieren.

Dieser Teil funktioniert. Dann füge ich ein Testprojekt hinzu, das auf das erste Projekt verweist. Der Teil, der nicht funktioniert, ist, wenn ich versuche, dotnet test zu tun.

Dann sagt es

gcc : error : ProjectName\cfile.cpp: No such file or directory 

Ich denke, $(SolutionDir) muss in diesem Fall nicht, oder etwas eingestellt werden.

Wenn ich das Projekt in eine Befehlszeilenanwendung ändern, und tun Sie dotnet run, die auch nicht funktioniert.

$(ProjectDir) scheint in diesem Fall weder in PreBuildEvent noch in PostBuildEvent verfügbar zu sein.

Was ist der beste Weg, dies einzurichten, damit es funktioniert?

+0

Ihr Prebuild-Ereignis befindet sich in einer Projektdatei, die wahrscheinlich einen festen Standort relativ zur Lösung aufweist (andernfalls könnten Sie SolutionDir nicht verwenden). Geben Sie stattdessen den Pfad zur cpp-Datei relativ zu $ ​​(ProjectDir) an. – stijn

+0

Aus irgendeinem Grund wird $ (ProjectDir) in den Prebuild- und Postbuild-Ereignissen zu nichts ausgewertet. – reveazure

+0

Das Problem tritt auch auf, wenn ich das Projekt in eine Konsolenanwendung ändere und versuche, 'dotnet run' darauf auszuführen. – reveazure

Antwort

Verwandte Themen