Пакеты CMake и Nuget в VisualStudio - PullRequest
0 голосов
/ 26 мая 2020

У меня есть проект со смешанными проектами C ++ и C#, где C ++ выполняет тяжелую работу, а C# обеспечивает внешний интерфейс. Чтобы иметь возможность переключаться между компиляторами C ++, мы переместили решение в CMake. Часть C ++ работает, но C#, который зависит от протобуфера Google, действует. Это самый маленький пример, который мне удалось создать: код Cmake

cmake_minimum_required(VERSION 3.12)
add_library(
    MyCSProject
    SHARED
    Test.cs
)

set_target_properties(SEM.Maeve PROPERTIES  VS_PACKAGE_REFERENCES "Google.Protobuf_3.11.4;Grpc.Tools_2.25.0;MathNet.Numerics_4.8.0-beta01"
                                        DOTNET_TARGET_FRAMEWORK_VERSION "v4.5" 
                                        )
add_dependencies(MyCSProjectMyProjectWrapperCpp) # MyProjectWrapperCpp is generated before
target_compile_options(MyCSProject PUBLIC "/unsafe" "/langversion:7")

, где Test.cs - это просто:

using System;
using Google.Protobuf.Collections;

namespace Test
{
    public struct Test
    {
      public  RepeatedField<int> data;
    }
}

Сгенерированная компиляция в VS (с использованием последней версии 16.6. 0, а VisualStudio 19 в качестве генератора) -

   C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csc.exe /noconfig /unsafe+ /nowarn:1701,1702 /nostdlib+ /platform:x64 /define:TRACE /highentropyva+ /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll" /debug+ /debug:full /optimize- /out:obj\x64\RelWithDebInfo\MyProject.dll /ruleset:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset" /subsystemversion:6.00 /target:library /utf8output /langversion:7.3 C:\sw_source\MyProject\src\MyProject\Test.cs "obj\x64\RelWithDebInfo\.NETFramework,Version=v4.5.AssemblyAttributes.cs"

Нет никаких следов Protobuf, передаваемого компилятору, и неудивительно, что код возвращает ошибку:

Severity    Code    Description Project File    Line    Suppression State
Error   CS0246  The type or namespace name 'Google' could not be found (are you missing a using directive or an assembly reference?)        2   
Error   CS0246  The type or namespace name 'RepeatedField<>' could not be found (are you missing a using directive or an assembly reference?)   8   

Что я отсутствует, чтобы связать его с protobuf? Если я открою сгенерированное решение, оно компилируется нормально, поскольку файл csporj, как и ожидалось, содержит:

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.11.4" />
    <PackageReference Include="Grpc.Tools" Version="2.25.0" />
    <PackageReference Include="MathNet.Numerics" Version="4.8.0-beta01" />
  </ItemGroup>

Тем не менее, я хотел бы скомпилировать его из того же экземпляра VS, в котором я занимаюсь разработкой. РЕДАКТИРОВАТЬ: ошибка кажется случайной: при некоторой перестройке пакеты связаны правильно, я сообщу об ошибке в Microsoft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...