.NET 4.0 프로젝트에서 .NET 2.0 혼합 모드 어셈블리를 참조하려면 어떤 '추가 구성'이 필요합니까?


526

.NET 4.0 기능 중 일부를 사용하려는 프로젝트가 있지만 핵심 요구 사항은 2.X에 대해 컴파일 된 System.Data.SQLite 프레임 워크를 사용할 수 있다는 것입니다. 나는 여기에 허용되는 대답 과 같이 이것이 가능하다는 언급을 보았지만 실제로 이것을 달성하는 방법을 보지 못했습니다.

2.X 어셈블리를 참조하면서 4.0 프로젝트를 시도하고 실행하면 다음과 같은 결과를 얻습니다.

혼합 모드 어셈블리는 런타임 버전 'v2.0.50727'에 대해 빌드되며 추가 구성 정보가 없으면 4.0 런타임에로드 할 수 없습니다.

어떤 "추가 구성"이 필요합니까?




중요 : 오류 파일 "File"에서 오류가 발생 SGEN하면 수정 사항이 파일 sgen.exe.config옆에 있어야 sgen.exe합니다. 예를 들어 VS 2015의 경우을 만듭니다 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. 소스 : SGEN 혼합 모드 어셈블리 최소 파일 내용 :<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

답변:


686

CLR 2.0 혼합 모드 어셈블리 를 사용 하려면 다음을 포함하도록 App.Config 파일을 수정해야합니다.

<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

열쇠는 useLegacyV2RuntimeActivationPolicy깃발입니다. 이로 인해 CLR은 최신 버전 (4.0)을 사용하여 혼합 모드 어셈블리를로드합니다. 이것이 없으면 작동하지 않습니다.

이것은 혼합 모드 (C ++ / CLI) 어셈블리에만 중요합니다. 에 지정하지 않고 모든 관리되는 CLR 2 어셈블리를로드 할 수 있습니다 app.config.


@ 리드 당신의 제안을 시도했지만 예외가 여전히 나타납니다. 내 EXE 폴더에 복사되는 app.config를 다시 확인했는데 여전히 작동하지 않습니다. log4net을 사용할 때 나타납니다. 이 오류에 대해 아무것도 찾을 수 없습니다 : log4net 여기를 제외하고 : stackoverflow.com/questions/1866735/log4net-and-net-4-0 . 특정 문제에 대한 추가 정보를 얻는 방법에 대한 아이디어가 있습니까?
Dave

@Dave : log4net의 .NET 4 기본 버전을 사용할 수 있다고 제안합니다. 최상의 옵션처럼 보입니다. .NET 4 버전이 있다면 그것을 사용하십시오.
Reed Copsey

@ Reed는 하나도 없으며 실제로 log4net을 직접 컴파일해야한다는 의미로 그 대답을 해석했습니다. 나는 그렇게 할 수 있다고 생각하지만, 미리 컴파일 된 바이너리를 가져 와서 내 프로젝트에서 참조하고 싶습니다. 좀 더 살펴 보겠습니다. 그러나 app.config를 변경해도 작동하지 않는 이유를 생각할 수 있습니까? programname.exe.config를 사용해야한다고 생각했지만 시도했지만 작동하지 않았습니다. 제한된 경험에서 두 파일 이름은 모두 똑같습니다.
Dave

19
이 줄을 NUnit의 구성 파일 에 넣는 데 도움이 된 것은 다음과 같습니다. <startup useLegacyV2RuntimeActivationPolicy = "true"> <supportedRuntime version = "v4.0"/> <requiredRuntime version = "v4.0.20506"/> </ startup>
Filip Zawada

76
Microsoft는 예외 대화 상자에서 "
스택 오버플로

35

포럼 게시물 은 .NET Framework 개발자 센터에 있습니다. 통찰력을 제공 할 수 있습니다.

(앱의 구성 파일에 추가하십시오.)

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

2
이 앱 구성을 NANT 빌드에 어떻게 사용해야합니까?
sagar

14

대상으로하는 프레임 워크의 버전에 따라 올바른 문자열을 얻기 위해 여기를 볼 수 있습니다.

http://msdn.microsoft.com/en-us/library/ee517334.aspx

.Net 4.0 클라이언트를 대상으로하는 릴리스에서 정식 버전이 필요한 이유를 파악하기 위해 몇 시간을 낭비했습니다. 나는 이것을 결국에 사용했다 :

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0.30319" 
               sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

11

app.config 파일 을 설정하면 Visual Studio는 App.exe.config 라는 bin 폴더에 사본을 생성합니다 . 배치 중에이를 애플리케이션 디렉토리에 복사하십시오. 분명히 들리지만 놀랍게도 많은 사람들이이 단계를 놓칩니다. WinForms 개발자는 파일을 구성하는 데 사용되지 않습니다 :).


또 다른 방법은 app.config를 삭제 한 다음 Project-> Add-> New 항목에서 새 항목을 추가하고 General-> Application Configuration File (app.config라는 텍스트 파일을 만드는 것과 동일하지 않음)을 선택하는 것입니다
smirkingman

8

2.0 및 4.0 어셈블리를 함께 사용하는 것은 그리 간단하지 않습니다.

app.config에서 지원되는 프레임 워크 선언의 ORDER는 실제로 혼합 모드가 발생하는 예외에 영향을줍니다. 선언 순서를 뒤집 으면 혼합 모드 오류가 발생합니다. 이것이이 답변의 목적입니다.

따라서 Windows Forms 앱에서 오류가 발생하면 대부분 Windows Forms 앱을 사용해보십시오.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>

또는 프로젝트가 Windows Form이 아닌 경우. 웹 프로젝트에서 이것을 web.config 파일에 추가하십시오.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>

7

"useLegacyV2RuntimeActivationPolicy" 속성이 설정된 "startup" 요소를 추가하여 문제를 해결할 수있었습니다 .

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
</startup>

그러나이를 적용하려면 App.config에서 구성 태그의 첫 번째 하위 요소로 배치해야했습니다 .

<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....

1
와 함께 무슨 일이 있었 version="v2.0"나요?
SamB

1
2.0에는 빌드 번호가 필요하지만 4.0에는 필요하지 않으므로 최상위 버전이 올바르지 않습니다. 바닥이 맞습니다.
ickydime

5

위의 내용은 저에게 효과적이지 않았습니다 (웹 응용 프로그램에서 작업 중입니다). 그러나 이것은 ...

폴더에서 sgen.exe.config 파일을 편집하십시오 (먼저 생성해야 함). C : \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools (v7.0 폴더에도 하나 있지만 VS2012를 사용하고 있습니다)

XML의 내용은 다음과 같아야합니다 (이전 답변과 동일).

<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>

5

웹 서비스에서 작업 중이고 v2.0 어셈블리가 WcfSvcHost.exe에 의해로드 된 종속성 인 경우 다음을 포함해야합니다.

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" />
</startup>

.. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config 파일

이런 식으로 Visual Studio는 런타임에 로더를 통해 올바른 정보를 보낼 수 있습니다.


4

Visual Studio 2015로 변경했을 때이 문제가 발생 했습니다 . 위의 답변 중 어느 것도 우리에게 효과가 없었습니다. 결국 우리는 다음 구성 파일을 컴퓨터의 모든 sgen.exe 실행 파일에 추가하여 작동하게했습니다.

<?xml version ="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <supportedRuntime version="v4.0" />
        </startup>    
</configuration>

특히이 위치에서 .NET 4.0을 대상으로하는 경우에도

C : \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 도구


더 자세하게 얘기해 주 시겠어요? 이 구성 옵션을 기존의 모든 * .config 파일에 추가했거나 sgen.exe에 대한 .config 파일을 생성 했습니까?
Adam Spicer

내 Visual Studio 2015 테스트 프로젝트 에서이 문제가 발생했습니다. 이 게시물이 도움이되었습니다. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer

1
@AdamSpicer 우리는 이것을 모든 sgen.exe의 모든 .config 파일에 추가했습니다. 존재하지 않는 경우 생성했습니다.
CMD

3

이 구성을 사용했습니다.

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0"/>
    <supportedRuntime version="v4.0"/>
</startup>

나를 위해 일했다


3
v2.0 빌드 번호가 필요하지만 v4.0 빌드 번호가 필요하지 않은 경우 v2.0.50727이어야합니다.
linquize

1

Visual Studio 2015로 업그레이드 할 때이 문제가 있었으며 여기에 게시 된 솔루션은 아무런 차이가 없었지만 구성이 옳았지만 변경 위치는 아닙니다. 이 구성을 추가하여이 문제를 해결했습니다.

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

받는 사람 : C : \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ TE.ProcessHost.Managed.exe.config

그런 다음 Visual Studio를 다시 시작했습니다.


0

3-4 시간의 인터넷 검색 후이 문제를 해결했습니다. 나는 다음을 추가했다

<startup selegacyv2runtimeactivationpolicy="true">
  <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

그래도 문제가 해결되지 않으면-> Right Click on DLL오류가 발생 하는 프로젝트 참조 에서-> Select Properties-> Check the Run-time Version-> v2.0.50727문제 가있는 경우 해당 문제를 알고 있습니다. 문제는 :-당신은 2.0 Version of respective DLL. 해결책입니다 :- delete the respective DLL프로젝트 참조 download the latest version of DLL's에서 해당 웹 사이트에서 최신 버전 DLL 참조의 참조를 추가하면 작동합니다.


1
최신 버전의 DLL이 최신 버전의 .NET에 대해 컴파일되었다고 가정하고 있기 때문에 문제가 해결됩니까?
Lucas

0

이 같은 오류가 발생하여 제안 된 시작 명령문을 솔루션의 다양한 구성 파일에 영원히 추가하여 프레임 워크 불일치를 격리하려고했습니다. 아무것도 효과가 없었습니다. 또한 XML 스키마시작 정보를 추가했습니다 . 그것도 도움이되지 않았습니다. 문제를 일으킨 실제 파일 ( "이동 또는 삭제 된 것"만 표시)을 보면 실제로 라이센스 컴파일러 (LC) 인 것으로 나타났습니다.

문제가있는 licenses.licx 파일을 삭제하면 문제가 해결 된 것 같습니다.


0

VS 2008에서 VS 2010으로 일부 코드를 마이그레이션하는 동안 비슷한 문제가 발생했습니다. App.config 파일을 변경하면 문제가 해결되었습니다.

<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"
         sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>

0

이 위치에 다음을 추가하십시오 .C : \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName : sgen.exe.config (이 파일을 찾을 수 없으면 하나를 작성하여 추가하십시오)

 <?xml version ="1.0"?>

<configuration>
 <runtime>        
        <generatePublisherEvidence enabled="false"/>    
    </runtime>

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

이렇게하면 문제가 해결되었습니다.


0

나는 사용한다

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
</startup>

작동하지만 </configuration>태그 직전 에 시작 태그가 제대로 작동하지 않습니다


-1

또한 클래스 라이브러리에 문제가 있으면 주 라이브러리에 문제가있는 경우 클래스 라이브러리 에이 문제가 있습니다. 그냥 추가

<startup useLegacyV2RuntimeActivationPolicy="true">

클래스 라이브러리에서 선택하는 기본 응용 프로그램.


이것은 불완전한 솔루션입니다. 구성의 이름은 대소 문자를 구분하며 U를 잊어 버렸습니다.
Chuck Dee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.