program tip

관리되는 NuGet 패키지가 C ++ / CLI 프로젝트를 지원하도록하려면 어떻게해야합니까?

radiobox 2020. 11. 9. 07:59
반응형

관리되는 NuGet 패키지가 C ++ / CLI 프로젝트를 지원하도록하려면 어떻게해야합니까?


C # 프로젝트에서 사용할 때 잘 작동하는 NuGet 패키지를 만들었습니다. lib/net40디렉터리에 DLL이 포함되어 있으며 DLL 이 참조로 추가됩니다.

NuGet이 C ++를 지원하므로 DLL을 C ++ / CLI 프로젝트에서 관리 참조로 추가 할 수 있도록 패키지를 실제로 수정하려면 어떻게해야합니까? 이것을 설명하는 튜토리얼을 찾을 수 없습니다. 패키지를 그대로 추가하려고하면 다음 오류가 발생합니다.

'Native, Version = v0.0'을 대상으로하는 프로젝트에이 패키지를 설치하려고하지만 패키지에 해당 프레임 워크와 호환되는 어셈블리 참조 또는 콘텐츠 파일이 포함되어 있지 않습니다.

해결책은 파일을 lib / native 아래에 두는 것이라고 생각할 수 있지만 http://docs.nuget.org/docs/reference/support-for-native-projects 에 따르면 지원되지 않습니다. 또한 DLL을 lib 바로 아래에 두는 것은 아무 일도하지 않는 것 같습니다.

분명히 빌드 / 네이티브에서 .props또는 .targets파일로이 작업을 수행해야하지만이 작업을 수행하려면 해당 파일에 무엇을 넣어야합니까?


Patrick O'Hara가 썼 듯이 NuGet은 C ++ / CLI 프로젝트를 변경하지 않습니다. 참조 GitHub의 문제 NuGet / 홈 # 1121 - CLI를 프로젝트에 관리 패키지를 설치할 수 없습니다 . 그러나 NuGet 명령 줄 유틸리티를 사용하면 NuGet을 NuGet.exe다운로드하고 원하는 패키지의 압축을 풀 수 있습니다.

전체 예제 를 위해 Visual Studio 2013 C ++ / CLI 프로젝트에서 OptimizedPriorityQueue 1.0.0에 대한 참조를 추가하기 위해 수행 한 단계는 다음과 같습니다.

  1. 아직 열려 있지 않은 경우 패키지 관리자 콘솔을 엽니 다 ( 도구> NuGet 패키지 관리자> 패키지 관리자 콘솔 ).
  2. 패키지 관리자 콘솔에서 NuGet.CommandLine 패키지를 설치합니다.

    설치 패키지 NuGet.CommandLine
    

    (참고 :이 글을 쓰는 시점에서 NuGet.CommandLine의 최신 버전은 2.8.6입니다. 사용자에 따라 다를 수 있습니다.)

  3. 이제 프로젝트 폴더 내에 .nuget\packages.config다음 내용 이 포함 된 XML 파일 이 있어야합니다 .

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="NuGet.CommandLine" version="2.8.6" />
    </packages>
    
  4. Notepad ++와 같은 텍스트 편집기 <package>에서 원하는 패키지에 대한 요소를 추가 합니다. 이 경우 다음을 추가했습니다.

    <package id="OptimizedPriorityQueue" version="1.0.0" />
    

    .. <packages>요소 .

  5. 명령 프롬프트를 엽니 다 (VS2013 개발자 명령 프롬프트를 열었지만 일반 명령 프롬프트가 작동합니다.)

  6. cd 프로젝트 폴더에.
  7. 다음 명령을 실행하여 NuGet.CommandLine의 버전 번호가 다를 경우 변경합니다.

    . \ packages \ NuGet.CommandLine.2.8.6 \ tools \ NuGet.exe 설치 -NonInteractive -OutputDirectory 패키지 .nuget \ packages.config
    

    나를 위해 출력은 다음과 같습니다.

    'OptimizedPriorityQueue 1.0.0.0'설치.
    'OptimizedPriorityQueue 1.0.0.0'를 성공적으로 설치했습니다.
    packages.config에 나열된 모든 패키지가 이미 설치되어 있습니다.
    
  8. Visual Studio에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택 합니다. 에서 공용 속성> 참조 , 클릭 추가 새로운 참조 ... 버튼을 클릭합니다.
  9. 왼쪽에서 찾아보기선택합니다 . 참조 추가 대화 상자의 확인 및 취소 버튼 옆에 찾아보기… 버튼이 있습니다. 이를 클릭하여 파일 선택 대화 상자를 엽니 다.
  10. NuGet에서 압축을 푼 DLL을 packages프로젝트 폴더 하위 디렉터리로 이동하고 추가 단추를 클릭 합니다. 확인클릭 하여 참조 추가 대화 상자를 닫습니다.
  11. 이제 C ++ / CLI 프로젝트에서 어셈블리를 사용할 수 있습니다.

    using namespace Priority_Queue;
    
    //...
    

이 포트에 대한 답변에서 언급했듯이 ( Nuget은 C ++ / CLI 프로젝트에 Entity Framework를 설치하지 않음 ) NuGet은 C ++ / CLI 프로젝트를 변경하지 않습니다. 그러나 종속성을 다운로드하고 패키지를 해제합니다. make 종속성의 일부로 명령 줄에서 사용합니다. 명령 줄은 다음과 같습니다.

/.NuGet/NuGet.exe
      Install 
      -NonInteractive 
      -ConfigFile $ENV{SRC_ROOT}/.nuget/NuGet.config 
      -OutputDirectory $ENV{SRC_ROOT}/packages 
      $ENV{SRC_ROOT}/packages.config

더 쉽게 읽을 수 있도록 명령 줄 영역은 한 줄로 구분됩니다. 또한 NuGet을 .NuGet 폴더의 소스 제어에 확인하기로 결정했습니다. 목표는 다양한 환경 (모두 Visual Studio를 사용하는 것은 아님)에 맞게 빌드 머신을보다 쉽게 ​​설정할 수 있도록하는 것이 었습니다. 이 명령을 처음 실행 한 후에는 C ++ / CLI 프로젝트에 종속성을 수동으로 추가해야합니다.
도움이되기를 바랍니다.


실제로 다음 단계를 사용하여 "일반"NuGet 패키지를 설치하고 C ++ / CLI 프로젝트에서 자동으로 참조 할 수있는 가능성이있는 것 같습니다 (적어도 포함 NuGet >= 2.5).

  1. build\<ProjectName>.targets패키징 할 프로젝트에 파일을 추가 (또는 수정)하고 다음 내용을 넣습니다 ( <AssemblyName>실제 값 으로 대체해야 함 ).

    <?xml version="1.0" encoding="utf-8" ?>
    <Project ToolsVersion="4.0"
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- for C++/CLI projects only -->
      <ItemGroup Condition="'$(Language)' == 'C++'">
        <Reference Include="<AssemblyName>">
          <!--
            this .targets file is installed next to the assembly,
            so we do not have to figure out any versions or paths here ourselves
          -->
          <HintPath>
            $(MSBuildThisFileDirectory)..\lib\native\<AssemblyName>.dll
          </HintPath>
        </Reference>
      </ItemGroup>
    </Project>
    
  2. 에서 .nuspec포장 된 프로젝트 추가 하나 이상의 file항목도에서 어셈블리를 배치 할 lib\native\대상 시스템에서 디렉토리 :

    <package>
      <metadata>
        ...
      </metadata>
      <files>
        ...
        <!--
          add a copy of the assembly to lib\native to prevent NuGet
          from complaining about incompatible native projects
        -->
        <file src="bin\$configuration$\$id$.dll" target="lib\native\" />
        <file src="bin\$configuration$\$id$.xml" target="lib\native\" />
    
        <!-- don't forget about the .targets file containing the reference -->
        <file src="build\$id$.targets" target="build\" />
      </files>
      ...
    </package>
    

NuGet이 C ++ / CLI 프로젝트에 어셈블리 참조를 추가하지 않더라도 패키지에서 제공 하는 .props.targets파일을 계속 삽입 합니다. 그리고 1 단계의 사용자 지정 대상은 패키지 된 어셈블리에 대한 참조를 추가합니다.

One drawback of this solution, as far as I could see it, is that the reference added in such a way is not displayed in the Commpon Properties/Framework and References section of the C++/CLI project. There may also be others, so use it at your own risk...


The installer tries to add a reference to itself in the C# startup project. Make a C# project the startup project in the solution before install. Create a dummy C# project if you do not have one


Credentials are actually encrypted with the machinekey where the package source was added. Unless using the plaintext variant, the setApiKey command should probably be run as part of the build.

참고URL : https://stackoverflow.com/questions/18694947/how-can-i-make-my-managed-nuget-package-support-c-cli-projects

반응형