programing

웹 응용 프로그램 빌드 오류:CodeDom 공급자 유형은 Microsoft입니다.비주얼 C.CppCodeProvider를 찾을 수 없습니다.

magicmemo 2023. 7. 30. 17:34
반응형

웹 응용 프로그램 빌드 오류:CodeDom 공급자 유형은 Microsoft입니다.비주얼 C.CppCodeProvider를 찾을 수 없습니다.

빌드 서버에서 웹 응용 프로그램을 빌드/패킹하는 중에 다음 메시지와 함께 실패합니다.

ASPNETCOMPILLER 오류 ASCONFIG: CodeDom 공급자 유형 "Microsoft.비주얼 C.CppCodeProvider, CppCodeProvider, Version=10.0.0, Culture=neutral, PublicKey토큰=b03f5f7f11d50a3a"를 찾을 수 없습니다.

빌드 서버 환경은 다음과 같습니다.

  • Windows Server 2008 R2 표준
  • TeamCity 8.0.4
  • .NET 4.5
  • 윈도우즈 7 및 .NET 4용 윈도우즈 SDK
  • 윈도우즈 SDK for 윈도우즈 8 및 .NET 4.5
  • 휴대용 클래스 라이브러리 도구
  • ASP MVC 4

대상으로 하는 ASP MVC 4 웹 애플리케이션입니다.NET 4.5.

빌드 구성은 MSBuild를 사용하여 솔루션을 빌드하고 나중에 게시할 수 있도록 패키지에 배포하는 것으로 구성됩니다.

가 TeamCity를 실행할 때 할 수 .aspnet_compiler.exe.

는 내 DEV 시스템에 문제 없이 빌드되며 로컬 IIS에도 문제 없이 게시할 수 있습니다.

이 문제의 원인이 무엇인지 아는 사람이 있습니까?

갱신하다

아래 제 답변을 참조하십시오.

저는 VS 2017에서 웹 프로젝트를 구축할 때 이 오류가 발생했습니다.이 문제는 파일 탐색기에 숨겨진 node_modules 디렉토리를 만드는 것이었습니다.ASP가 중지된 것 같습니다.NET 컴파일러는 이러한 모든 파일을 검색할 수 없으므로 오류가 발생하지 않습니다.

이 게시물은 제게 중요한 단서를 주었습니다: 분명히 ASP입니다.NET 사전 컴파일은 프로젝트 및 출력 파일을 검색하고 언어에도 불구하고 검색되는 모든 원본 파일을 컴파일하려고 시도합니다(여기 참조).

이 경우, 내 웹 앱은 ".h" 파일을 따라 일부 관리되지 않는 dll을 포함하는 프로젝트에 의존합니다.이러한 파일은 출력 디렉터리("새로운 경우 복사")에 복사되므로 런타임에 핀보케할 수 있습니다.

ASP인 것 같습니다.NET 사전 컴파일은 ".h"를 찾아 컴파일할 필요가 없음에도 불구하고 컴파일을 시도합니다.합니다(" "" " " " " "와 같은 ").CppCodeProvider와 함께 제공됩니다.NET 2.0 SDK).

이러한 파일을 출력 디렉터리에 복사하지 않도록 프로젝트를 변경했을 때 빌드가 정상적으로 실행되었습니다.저는 또한 파일 복사를 테스트했지만, 게시 프로필에서 "Precompile Before Publish"가 false로 설정되어 있었고, 또한 작동했습니다.

이제 몇 가지 옵션이 있지만 마음에 드는 옵션은 없습니다.

  • "Precompile Before Publish"를 사용 불가능으로 설정합니다.그것의 주요 단점은 사용자들이 경험하는 앱이 첫 번째 사이트 접속 속도가 느릴 것이라는 것입니다.

  • 출력 폴더에서 파일을 제외하고 사전 컴파일 후 다시 추가합니다.애당초 걱정하지 말아야 할 일이 많은 것 같습니다.

  • 실행할 때 "aspnet_compiler.exe"에게 문제가 되는 파일/폴더를 제외하도록 하십시오."Precompile Before Publish"만 제어할 수 있기 때문에 게시 프로필을 사용하는 방법을 알 수 없습니다.또한 "aspnet_compiler.exe"는 해당 옵션(여기여기)을 제공하지 않는 것 같습니다.

"Precompile Before Publish"는 주의 사항이 거의 없는 빠른 경로인 것 같으니 사용하지 않도록 설정하겠습니다.하지만 저는 게시 프로필을 사용하여 사전 컴파일에서 폴더나 파일 형식을 제외하는 더 나은 방법이 있어야 한다고 생각합니다.

나중에 구글에서 이것을 찾는 사람들의 이익을 위해...

근본 원인

오류가 의미하는 바와 같이, "Microsoft" 어셈블리입니다.비주얼 C.CppCodeProvider"를 찾을 수 없습니다.

이것은 Visual Studio 2015 설치의 일부로 GAC(Global Assembly Cache)에 추가되었지만 Visual Studio 2017에는 추가되지 않았습니다.

픽스

적절한 해결책은 누락된 참조를 GAC에 추가하는 것입니다.

"개발자 명령 프롬프트"를 관리자로 실행하고 다음을 실행합니다.

gacutil /i "path to CppCodeProvider.dll"또는gacutil /i "C:\Program Files (x86)\Microsoft Visual Studio\2 017\Professional\Common7\IDE\PublicAssemblies\CppCodeProvider.dll"

예.


C:\Windows\System32>gacutil /i "C:\Program Files (x86)\Microsoft Visual Studio\2
017\Professional\Common7\IDE\PublicAssemblies\CppCodeProvider.dll"
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Assembly successfully added to the cache

C:\Windows\System32>

다음 빌드에서는 더 이상 다음 오류가 발생하지 않습니다.

ASPNETCOMPILLER 오류 ASCONFIG: CodeDom 공급자 유형 "Microsoft.비주얼 C.CppCodeProvider, CppCodeProvider, Version=10.0.0, Culture=neutral, PublicKey토큰=b03f5f7f11d50a3a"를 찾을 수 없습니다.

VS2017로 업데이트하면서 이런 일이 벌어지기 시작했습니다.문제는 node.js였는데, node_modules 폴더를 삭제하면 프로젝트가 오류 없이 빌드됩니다.여기서 앤더스가 제안한 대로 csproj 파일에서 MvcBuildViews 값을 false로 변경하면 해결되는 것으로 나타났습니다.그러나 이는 IIS가 mvc 보기를 렌더링할 때까지 컴파일되지 않기 때문에 이상적이지 않습니다.개인적으로, 저는 문제를 해결하기 위해 node_modules 폴더를 숨기지만, 다른 사람에게 근본적인 문제를 밝히는 데 도움이 될 경우를 대비하여 이 답변을 추가하고 싶었습니다.

<MvcBuildViews>false</MvcBuildViews>

저의 경우, 저는 이 오류를 유발하는 각진 웹사이트를 제 솔루션에 추가했습니다.

다음 단계를 통해 오류를 해결했습니다.

메뉴 모음에서 빌드 > 구성 관리자를 선택합니다.

프로젝트 컨텍스트 테이블에서 각진 웹 사이트(node_modules 포함)를 제외합니다.

프로젝트의 빌드 열에서 확인란의 선택을 취소합니다.

닫기 단추를 선택한 다음 솔루션을 재구성합니다.

제 시나리오에서는 ASP와 함께 Perl 인터프리터를 발송해야 합니다.Net 웹 사이트(Perl이 필요한 이유는 묻지 않고 미리 죄송합니다!), 그리고 여기에는 aspnet_compiler를 발생시킨 .c 파일이 포함되어 있습니다.다른 사람들이 그들의 문제라고 언급했듯이, exe는 오류를 범합니다.perl 디렉터리는 내 bin 폴더에 있으며 런타임에 필요합니다.

이 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠattrib +H폴더, 실제로 aspnet_messages에 의해 건너뛰었지만 게시 출력 폴더에는 없습니다.그래서 저는 폴더를 숨기고, 보기를 컴파일하고, 폴더 숨기기를 해제한 다음 폴더를 올바른 위치로 복사하여 더 많은 해킹을 해야 했습니다.의 이은원본수는포다니습함을 하는 것을 포함했습니다.AspNetPreCompile작업. 아래를 참조하십시오.

<!-- Overwrite AspNetPreCompile task because it was trying to compile .c files found in the Perl directory. This prevents that but still copies Perl to publish file. -->
<!-- Taken from: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\Web\Transform -->
<Target Name="AspNetPreCompile" DependsOnTargets="$(AspNetPreCompileDependsOn)"  Condition="'$(AspNetPreCompile)' != 'false'">

    <PropertyGroup  Condition="'$(UseMetabasePath)' == 'true'" >
        <_PreAspnetCompileMergeSingleTargetFolderFullPath></_PreAspnetCompileMergeSingleTargetFolderFullPath>
        <_AspNetCompilerVirtualPath></_AspNetCompilerVirtualPath>
    </PropertyGroup>
    <PropertyGroup  Condition="'$(UseMetabasePath)' != 'true'" >
        <_PreAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PreAspnetCompileMergeSingleTargetFolder)))</_PreAspnetCompileMergeSingleTargetFolderFullPath>
    </PropertyGroup>

    <PropertyGroup>
        <_PostAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PostAspnetCompileMergeSingleTargetFolder)))</_PostAspnetCompileMergeSingleTargetFolderFullPath>
    </PropertyGroup>

    <!-- Modification #1. -->
    <Exec Command="attrib +H &quot;$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl&quot;" />

    <AspNetCompiler
        PhysicalPath="$(_PreAspnetCompileMergeSingleTargetFolderFullPath)"
        TargetPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)"
        VirtualPath="$(_AspNetCompilerVirtualPath)"
        Force="$(_AspNetCompilerForce)"
        Debug="$(DebugSymbols)"
        Updateable="$(EnableUpdateable)"
        KeyFile="$(_AspNetCompileMergeKeyFile)"
        KeyContainer="$(_AspNetCompileMergeKeyContainer)"
        DelaySign="$(DelaySign)"
        AllowPartiallyTrustedCallers="$(AllowPartiallyTrustedCallers)"
        FixedNames="$(_AspNetCompilerFixedNames)"
        Clean="$(Clean)"
        MetabasePath="$(_AspNetCompilerMetabasePath)"
        ToolPath="$(AspnetCompilerPath)"
        />

    <!-- Modification #2. -->
    <Exec Command="attrib -H &quot;$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl&quot;" />

    <!--
        Removing APP_DATA is done here so that the output groups reflect the fact that App_data is
        not present
        -->
    <RemoveDir Condition="'$(DeleteAppDataFolder)' == 'true' And Exists('$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data')"
                Directories="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data" />


    <CollectFilesinFolder Condition="'$(UseMerge)' != 'true'"
        RootPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)" >
        <Output TaskParameter="Result" ItemName="_AspnetCompileMergePrecompiledOutputNoMetadata" />
    </CollectFilesinFolder>

    <ItemGroup Condition="'$(UseMerge)' != 'true'">
        <FileWrites Include="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\**"/>
    </ItemGroup>

    <!-- Modification #3. -->
    <ItemGroup>
        <Perl Include="$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl\**\*.*" />
    </ItemGroup>

    <!-- Modification #4. -->
    <Copy SourceFiles="@(Perl)" DestinationFolder="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\bin\perl\%(RecursiveDir)"></Copy>

</Target>

파일을 . 이 합니다. 이 파일을 .csproj 파일에 하위 파일로 복사합니다.<project>vmdk

주요 이점:

사용하다Exec를 의로령에 입력합니다.attrib +H Directory통해 aspnet_compiler.aspnet_messages를 하기 파일 하고 AspNetCompiler 파일 이름합니다.attrib -H Directory

다음을 작성합니다.ItemGroup아직 복사해야 하는 파일을 모두 빨아들이는 것입니다.

을 합니다.Copy그 태크스활, 을하는용을 하여.ItemGroup나머지 게시 작업에 포함할 파일을 필요한 위치에 배치합니다.Microsoft가 이 작업을 작성할 때 작성한 모든 변수를 사용할 수 있으므로 여기서도 변수를 사용할 수 있습니다.

원래 작업 수정에 대한 찬성: 정상적인 동작에 대한 변경 사항이 거의 없으므로 여전히 작동합니다.

원래 작업을 수정할 수 있는 콘:Microsoft는 나중에 이 작업을 변경하여 사본이 오래된 것으로 만들 수 있습니다.

이상한 요구 사항이 없는 경우 폴더를 숨기는 더 간단한 방법은 다음과 같습니다.

<Target Name="Test" BeforeTargets="AspNetPreCompile">
    <Exec Command="attrib +H Directory" />
</Target>
<Target Name="Test" AfterTargets="AspNetPreCompile">
    <Exec Command="attrib -H Directory" />
</Target>

Twamley가 Arthur Nunes의 답변에서 영감을 얻은 답변입니다.

제 경우에는 node_modules 폴더였습니다..net 4.8 앱을 수정하기 위해 csproj 파일에서 변경했습니다.

이렇게 하면 숨겨진 특성이 node_modules 폴더에 추가된 다음 Razor 페이지가 컴파일된 후 숨김을 해제할 수 있습니다.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <Exec Command="attrib +H &quot;$(ProjectDir)node_modules&quot;" />
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
  <Exec Command="attrib -H &quot;$(ProjectDir)node_modules&quot;" />
</Target>

다음을 수행해 보십시오.

RequireTargetFramework를 4.0으로 설정합니다.

링크:ASPNETCOMPILLER 오류 ASCONFIG:'Microsoft' 파일 또는 어셈블리를 로드할 수 없습니다.Visual Basic.활동.컴파일러' 또는 그 종속성 중 하나

제 경우 문제는 IIS의 상위 솔루션(루트 수준 프로젝트)의 웹 구성이 웹 구성에 이 기능이 포함되어 있다는 것입니다(실수로 이 기능이 어떻게 제공되었는지 확실하지 않음).솔루션/프로젝트에서 수행할 수 있는 작업이 전혀 영향을 미치지 않기 때문에 추적하는 데 오랜 시간이 걸렸습니다.

따라서 관련된 모든 것의 web.config를 확인할 가치가 있습니다.

IIS에서 웹 사이트의 물리적 경로가 올바르지 않을 때 이 오류가 표시되었습니다.해당 오른쪽을 해결하려면 웹 사이트(웹 사이트 관리 -> 고급 설정 -> 물리적 경로)를 클릭합니다.

제 경우, 새 컴퓨터에 VS2017을 설치하고 소스 제어에서 asp.net core 1.1 웹 애플리케이션을 열었습니다.오류가 표시되었습니다.node.js를 설치하고 프로젝트를 컴파일했습니다.

이 오류에 대한 저의 해결책은 이 페이지에 있는 두 개의 기존 답변을 조합하는 것이었습니다.VS 2017 시스템에서 프로젝트를 빌드하기 전까지는 문제가 발생하지 않은 .h 파일이 웹 프로젝트 디렉토리에 있었습니다.

저 같은 경우에는 단순히 압축을 풀었지만, 결과적으로 관련이 없는 코드 파일을 웹 디렉터리에 더 이상 저장할 수 없습니다. 그렇지 않으면 VS가 컴파일을 시도하다가 실패할 것입니다.

노드 모듈 폴더를 삭제하고 내장된 VS2019 터미널이 아닌 gitbash에서 npmi를 실행하여 해결했습니다.

알았다.cppprovider.dllVisual Studio 2015 설치 경로에서 다음 위치로 이동합니다.

C:\Program Files(x86)\Microsoft Visual Studio 11.0\공통7\IDE\공용 어셈블리

쉽게 해결할 수 있는 방법은 다음을 참조하는 것입니다.CppCodeProvider.dll위치는 다음과 같습니다.

C:\Program Files(x86)\Microsoft Visual Studio{version}\{edition}\Common7\IDE\공용 어셈블리

예:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\PublicAssemblies\CppCodeProvider.dll

그것은 bin 폴더에 있을 것입니다.

enter image description here

VS2019에서 VS2022로 솔루션을 이동했는데 솔루션을 게시하려고 할 때 이 오류가 발생했습니다.이것이 제가 오류를 사라지게 한 방법입니다.

  • References >> References 추가를 마우스 오른쪽 버튼으로 클릭합니다.
  • 그런 다음 Microsoft를 검색합니다.비주얼 C
  • Microsoft를 선택합니다.Visual C 및 Microsoft.비주얼 C.VSCode 공급자
  • OK를 클릭합니다.오류가 사라졌습니다!

새 노트북에 VS2019를 설치했는데 OP와 동일한 오류 메시지가 계속 표시되었습니다. (데스크탑 PC에서도 여전히 정상적으로 작동했습니다.)

하루 정도 구글과 여기에 대한 모든 답을 시도했지만 아무런 기쁨도 얻지 못한 후, 저는 툴바에서 제 웹사이트를 게시 폴더에 내장한 웹 을 사용하려고 했습니다.

그런 다음 이 '게시' 폴더를 가져와 C: 드라이브의 새 위치에 복사했습니다.

그런 다음 VS2019를 닫고 다시 연 후 "코드 없이 계속"으로 시작했습니다.

그런 다음 파일 -> 열기 -> 웹 사이트...내 '게시' 폴더를 선택하면 이제 로컬로 프로젝트를 빌드하고 디버그할 수 있습니다.

node_modules로 웹 프로젝트를 구축할 때 문제가 발생했습니다.Visual Studio 설치 프로그램에서 C++ 옵션으로 Desktop development를 활성화하여 오류를 해결했습니다.

출처: https://developercommunity.visualstudio.com/t/cppcodeprovider-not-properly-installed-with-vs2017/240322#T-N333161

Visual Studio 2017에서 CppCodeProvider.dll은 "Desktop development with C++"과 함께 제공되므로 "Desktop development with C++"을 설치하면 문제가 해결됩니다.

언급URL : https://stackoverflow.com/questions/20545224/web-application-build-error-the-codedom-provider-type-microsoft-visualc-cppcode

반응형