2008-09-23 1 views
3

을 최적화 코드를 잘못 최적화했습니다. (설정 고유 개체의 집합을 구현하는 클래스 유의 그것은을 IEnumerable에서 상속..)이 줄을 :C# 컴파일러는 잘못 I가 원격 웹 서버에서 실행되는 ASP.NET 응용 프로그램이 난 그냥이 오류를 받기 시작 코드

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

는 CalendarModule 클래스는 완전히이다

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

이 라인으로 컴파일 무관 한 수업 !! 누구도 .NET과 같은 코드를 잘못 컴파일 한 것을 눈치 채셨습니까?

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

업데이트 # 2 : 지금까지이 문제를 해결하기위한 두 가지 방법을 찾았습니다. 근본적인 문제가 무엇인지는 잘 모르지만 둘 다 해결됩니다.

  1. 최적화 기능을 해제하십시오.

  2. 어셈블러를 ILMerge와 다른 시스템에 병합하십시오.

그래서 우리는 빌드 시스템이 아니면 다른 문제가있는 경우 (우리가 지금 년 이상에 대한 자료를 구축하기 위해 기계를 사용하고있는 점을 감안 이상이다) 어떻게 든 잘못되면 궁금 남아 있습니다.

+0

문제를 디버그하기에 충분하지 않은 코드입니다. 어딘가에서 문제를 재현하기 위해 코드를 충분히 업로드 할 수 있습니까? – Wedge

+2

Int가 CalenderModule에서 상속 받았는지 모르십니까? :) – FlySwat

답변

7

Ahh, ILMerge - 질문에 대한 추가 정보가 문제 해결에 도움이됩니다. NET 컴파일러가 이런 식으로 실패 할 것이라고 기대하지는 않지만 ILMerge에서 이런 종류의 일을 때때로 기대할 것입니다.

내 생각 엔 두 개의 어셈블리가 동일한 최적화 '트릭'을 사용하고 있고 병합되면 충돌이 발생합니다.

Microsoft에서 버그를 제기 했습니까?

ILMerge에 대한 필요성을 줄임으로써 해결 방법은 소스에서 어셈블리를 단일 어셈블리로 다시 컴파일하는 것입니다. csproj 파일은 XML 목록이므로 기본적으로 병합하기가 쉽습니다. 추가 MSBuild 단계로 자동화 할 수 있습니다.

+0

.csproj 파일을 병합하는 것이 좋습니다. 시도해 볼 수 있습니다. –

+0

ILMerge없이 cs/vb 컴파일러를 사용하여 여러 어셈블리를 컴파일하는 방법에 대해 좋은 사람이 있습니까? – Lamar

+0

@ 라마르 : 나는 이미이 질문에 이미 답했습니다. http://stackoverflow.com/questions/1878807/vs2008-creating-single-dll-from-solution-with-many-projects/1879281#1879281을 참조하십시오. –

1

보고있는 어셈블리가 실제로 해당 소스 코드에서 생성되었는지 확인하십시오? 작은 테스트 케이스로이 문제를 재현 할 수 있습니까?

편집 : 리플렉터를 사용하는 경우 MSIL에서 C# 로의 변환이 잘못되었을 수 있습니다. 리플렉터가 디 컴파일 할 때 항상 100 % 정확하지는 않습니다. MSIL은 어떤 모습입니까?

편집 2 : 흠 ... 방금 리플렉터가 잘못 될 수 없다는 것을 깨달았거나 런타임에 오류 메시지를받지 못했을 것입니다.

+0

지금까지 더 작은 테스트 케이스로 문제를 재현 할 수 없었습니다. 이 경우 디스 어셈블리가 올바른 것처럼 보입니다. 이것은 ICollection 생성자를 참조하는 오류로 증명됩니다. –

+0

최적화하지 않고 컴파일하면 오류를 없앨 수 있습니까? –

0

코드가 최근에 해당 서버에 배포 되었습니까? 누군가가 당신의 지식없이 빌드를 밀었을 수 있습니까? 소스 코드로 이동하여 최신 정보를 가져 와서 문제를 복제 할 수 있습니까?

주어진 시점에서, 필자는 그것이 컴파일러가 아닌지 의심 스럽습니다.

1

.Net 컴파일보다 리플렉션 도구에서 문제가 될 가능성이 큽니다. 얻는 오류 - 원격 처리 중에 찾을 수없는 생성자가 직렬화 문제 일 가능성이 큽니다 (직렬화가 가능한 모든 클래스에는 매개 변수없는 생성자가 필요함).

리플렉션 도구에서 발견 된 코드가 타입 변환 예외를 던질 가능성이 큽니다.

+0

코드에 직렬화가 일어나지 않습니다. –

+0

괜찮지 만 예외를 throw하려면 다음 코드가 필요합니다. new ICollection () – Keith

1

나는 커틀과 침대 모두에 동의합니다. 이것은 무언가가 심각하게 잘못된 것처럼 들립니다.옵티마이 저는 우리 모두에게 효과가 있었으며 그런 버그는보고되지 않았습니다. 사실, 당신이 실제로 뭔가 잘못하고있는 것일 수 있습니까?

Sidenote : 또한 은 .Net fx 3.5에 있으며 정확하게 Set<> 클래스가해야하는 것을 지적하고 싶습니다.

+0

"select is not broken"학교에 동의하며 실제로 잘못된 컴파일러가 원인 일 수는 없습니다. 나쁜 선택처럼 보이게하는 요소. HashSet에 대한 팁을 주셔서 감사합니다. , 불행히도 우리는 아직 3.5에 아직 2.0이 아닙니다. –

0

아야. ILMerge가 실제로 잘못이라면,이 주제를 조사 결과와 함께 최신으로 유지하십시오. ILMerge를 COM interop 어셈블리를 구성하는 핵심 단계로 사용합니다.

+0

내가 찾은 것을 알려 드리겠습니다. –

관련 문제