2008-08-18 13 views
4

새 UI를 Managed/C# 토지로 마이그레이션하려는 경우 최근에 MFC를 사용하는 대규모 레거시 프로젝트에서 공용 언어 런타임 지원 (/ clr)을 설정했습니다 공유 DLL을 사용하고 있으며 전체 솔루션 내에서 약 12 ​​개의 다른 프로젝트를 사용합니다. 이 프로젝트는 우리 애플리케이션의 핵심이며 제작 된 관리 UI 코드를 구동합니다 (따라서 interop에 대한 clr 지원을 켜야 할 필요성).혼합형 C++/CLI TypeLoadException 내부 제한 : 필드가 너무 많습니다.

작은 niggly 오류 및 경고의 톤을 고정 후, 나는 마침내 컴파일 할 수있는 응용 프로그램을 얻을 수 있었다 .. 그러나, 응용 프로그램을 실행하는 것은 EETypeLoadException 원인 및 디버깅 날 수없는 잎 ...

일부를 수행 파고, 원인을 "System.TypeLoadException : 내부 제한 : 너무 많은 필드를." 이것은 편집이 끝날 때 바로 발생합니다. 그런 다음 두 개 이상의 dll로 어셈블리를 나눌 것을 제안하는 this link을 발견했습니다. 그러나, 내 경우에는 가능하지 않습니다. 제한 사항은 레거시 코드가 기본적으로 그대로 유지된다는 것입니다.

다른 가능한 해결책을 제시 할 수있는 사람이 있습니까? 나는 정말로 여기 막 다른 길에 서있다.

답변

7

C/C++ 코드 생성에서 Enable String Pooling 옵션이 켜져 있는지 확인하십시오.

일반적으로이 문제가 수정되었는데, 그 중 하나가 "허?"입니다. Excel 스프레드 시트의 64k 제한과 같은 MS 제한 사항. 이 요소 만 어셈블리에 나타날 수있는 기호의 수에 영향을 미칩니다.

2

매우 큰 혼합 모드 (C#/C++) 응용 프로그램을 3 번 (3x) 사용하고 위의 수정 프로그램을 한 번 넣으면 오류가 다시 발생하지 않았습니다.

그리고 아니, 어떤이 (. 당신이 이제까지 그러나, 측정 할 수 아무것도) 약간 빠른 런타임 실행을 초래한다

하지만 그것은 다소 임시 변통의의 동의합니다. 기호에 대한 내부 제한은 문제가되지 않거나 제한이있는 경우 제한이 훨씬 더 큽니다. 그런 다음 MS는 로더 코드 중 일부를 변경했습니다. 나는 MSDN을 가지고 그것에 대해 호언 장담했고, "바보 만이 하나의 어셈블리에 많은 심볼을 넣을 것"이라는 불확실한 용어로 말하지 않았다.

(나는 더 이상 MSDN에 참여하지 않는 이유 중 하나입니다.)

글쎄, 바보 나 색상,하지만 난 내 응용 프로그램의 물리적 구조를 변경해야한다고 생각하지 않습니다 밖으로 물건을 깨는 로더가 10,001 개의 기호가 1을 너무 많이 결정했다는 사실을 회피하기 위해 위성 DLL로 변환합니다.

그리고 지적했듯이 어셈블리/위성 DLL이 구조체 인 방식과 이러한 구조체에 포함 된 종속성의 종류를 제어 할 수없는 경우가 종종 있습니다.

그러나 나는이 오류를 다시 볼 수있을 것이라고 생각하지 않습니다.

+0

여전히 디버그 64 빌드에서 문자열 풀링 오류가 발생합니다. Visual Studio의 버그와 솔루션에 여러 관리되는 어셈블리를 만들기 때문에 어셈블리를 분해하지 않습니다. VS 2008 사용. –

3

전체 프로젝트에서/clr을 켜야합니까? 적은 수의 파일에 대해서만 사용 설정하고 관리되는 코드를 어떻게 포함하는지 매우주의해야합니까? 커다란 C++/MFC 응용 프로그램과 함께 작업하며 관리되는 C++를 사용하기가 매우 어려웠습니다. 저는 C#과 .NET을 좋아하지만 managed C++는 두통이었습니다. 우리의 문제의 대부분은 .NET 1.0/1.1에서 발생했습니다 ... 아마도 상황이 더 좋을 수도 있습니다.