문제

원격 웹 서버에서 ASP.NET 응용 프로그램이 실행 중이며 방금이 오류를 얻기 시작했습니다.

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.

DLL에서 코드를 분해했으며 컴파일러가 코드를 잘못 최적화하는 것처럼 보입니다. (세트는 고유 한 개체 세트를 구현하는 클래스입니다. ienumerable에서 상속합니다.)이 줄 :

Set<int> set = new Set<int>();

이 라인으로 컴파일됩니다.

Set<int> set = (Set<int>) new ICollection<CalendarModule>();

CalendArmodule 클래스는 완전히 관련이없는 클래스입니다 !! 이와 같이 .NET이 이와 같이 잘못된 코드를 잘못 컴파일 한 것을 본 적이 있습니까?

업데이트 #1 : 이 문제는 Microsoft 's에 의해 도입 된 것 같습니다 일 머지 도구. 우리는 현재 그것을 극복하는 방법을 조사하고 있습니다.

업데이트 #2 : 우리는 지금 까지이 문제를 해결하는 두 가지 방법을 찾았습니다. 우리는 근본적인 문제가 무엇인지 이해하지 못하지만이 두 가지 모두 문제를 해결합니다.

  1. 최적화를 끕니다.

  2. 어셈블리를 다른 기계의 Ilmerge와 병합하십시오.

그래서 우리는 빌드 머신이 어떻게 든 잘못 구성되어 있는지 궁금해합니다 (현재 1 년 넘게 릴리스를 빌드하기 위해 기계를 사용하고 있다는 점을 고려하면 이상합니다).

도움이 되었습니까?

해결책

Ahh, Ilmerge- 질문에있는 추가 정보가 실제로 문제에 도움이됩니다. .NET 컴파일러가 이런 식으로 실패 할 것으로 기대하지는 않지만 때때로 Ilmerge와 함께 이런 종류의 것을 볼 것으로 예상됩니다.

내 생각에 두 명의 어셈블리가 동일한 최적화 '트릭'을 사용하고 있으며 일단 합병되면 충돌을 일으킨다는 것입니다.

Microsoft로 버그를 올렸습니까?

그 동안 해결 방법은 소스에서 어셈블리를 단일 어셈블리로 재 컴파일하여 Ilmerge의 필요성을 절약하는 것입니다. CSPROJ 파일은 XML 목록에 불과하므로 기본적으로 병합하기 쉽고 추가 MSBuild 단계로 자동화 할 수 있습니다.

다른 팁

당신이보고있는 어셈블리가 실제로 해당 소스 코드에서 생성되었다고 확신합니까? 작은 테스트 사례 로이 문제를 재현 할 수 있습니까?

편집하다: 반사기를 사용하는 경우 MSIL에서 C# 변환이 올바르게 작동하지 않을 수 있습니다. 반사기가 소집 할 때 항상 100% 정확한 것은 아닙니다. MSIL은 어떻게 생겼습니까?

편집 2 : 흠 ... 방금 결함이 없거나 런타임에 오류 메시지를받지 못했을 것임을 깨달았습니다.

이는 .NET 컴파일보다 반사 도구에서 문제가 될 가능성이 높습니다. 오류가 발생합니다. 리모닝 중에 찾을 수없는 생성자는 직렬화 문제 일 가능성이 높습니다 (모든 일련의 클래스에는 매개 변수가없는 생성자가 필요합니다).

반사 도구에서 발견 된 코드는 타입 캐스트 예외를 던질 가능성이 높습니다.

나는 커트와 침대 모두에 동의합니다. 이것은 무언가가 심각하게 잘못된 것 같습니다. Optimizer는 우리 모두를 위해 일했으며 그러한 버그는보고되지 않았습니다 (내가 알고있는) - 실제로 당신이 뭔가 잘못하고있을 수 있습니까?

Sidenote : 나는 또한 지적하고 싶습니다 System.Collections.Generic.HashSet<T> .NET FX 3.5에 있고 정확히 무엇을 Set<> 수업이 있어야합니다.

최근 코드가 해당 서버에 배포 되었습니까? 누군가가 당신의 지식없이 빌드를 추진했을 수 있습니까? 소스 컨트롤로 가서 최신을 가져오고 문제를 복제 할 수 있습니까?

이 시점에서 주어진 정보를 사용하면 컴파일러인지 의심합니다.

아야. 이것이 실제로 잘못된 경우,이 주제를 귀하의 연구 결과와 최신 상태로 유지하십시오. 저는 Ilmerge를 COM 인터 로프 어셈블리를 구성하는 핵심 단계로 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top