2017-02-09 9 views
0

Я строю проект в C# для взаимодействия с библиотекой C++. Поскольку я хочу, чтобы это была кросс-платформа, я использую .NET Core RC3, хотя я не уверен, что это актуально.Как я могу построить родную DLL как часть процесса сборки .NET?

Прямо сейчас у меня есть CPP файлы в моем проекте, и у меня есть PreBuildEvent как

<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> 

DLL, будет построен, а затем копируются в выходной каталог. Затем я использую PInvoke для общения с ним.

Эта часть работает. Затем я добавляю тестовый проект, который ссылается на первый проект. Часть, которая не работает, когда я пытаюсь сделать dotnet test.

Тогда он говорит

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

Я думаю $(SolutionDir) не должен быть установлен в этом случае, или что-то.

Если я сменил проект на приложение командной строки и сделаю dotnet run, что тоже не работает.

$(ProjectDir) не представляется возможным в этом случае либо в PreBuildEvent, либо в PostBuildEvent.

Каков наилучший способ установить это, чтобы он работал?

+0

Ваше событие предварительной сборки находится в файле проекта, который, вероятно, имеет фиксированное местоположение относительно решения (иначе вы не сможете использовать SolutionDir в первую очередь). Поэтому укажите путь к файлу cpp относительно $ (ProjectDir). – stijn

+0

По какой-то причине $ (ProjectDir) не имеет ничего общего с событиями prebuild и postbuild. – reveazure

+0

Проблема также возникает, если я изменяю проект на консольное приложение и пытаюсь выполнить «dotnet run» на нем. – reveazure

ответ

0

Похоже $(MSBuildProjectDirectory) следует использовать вместо ... When does MSBuild set the $(ProjectName) property?

Это похоже на работу для всех комбинаций сборки, тестирования и запуска в Visual Studio и из командной строки.