.NET에서 Reflect & 방출을 사용하여 동적 어셈블리를 생성하려고합니다. "Common Language Runtime이 잘못된 프로그램을 발견했습니다."라는 오류 메시지가 나타납니다. 난 하드 코딩 된 형식을 사용하여 원하는 기능을 가진 다른 프로그램을 만들었습니다. 작성하려고하는 기능은 궁극적으로 동적 유형을 사용하지만 ILDasm을 사용하여 생성해야하는 IL을 볼 수 있습니다. 나는 컴파일러가 생성하는 일리노이와 생성하고있는 일리노이를 비교하고있다. 내가 컴파일러가 생성 한 코드에 추가 항목이보고 한 방법의 .locals 초기화 선언에서CLR IL - .locals 초기화에 대괄호 대괄호
컴파일러가 생성 :
.locals init ([0] class [System.Core]System.Linq.Expressions.ParameterExpression CS$0$0000,
[1] class [System.Core]System.Linq.Expressions.ParameterExpression[] CS$0$0001)
내 :
.locals init (class [System.Core]System.Linq.Expressions.ParameterExpression V_0,
class [System.Core]System.Linq.Expressions.ParameterExpression[] V_1)
내가 돈 ' 컴파일러가 생성 한 코드에서 "[0]"과 "[1]"의 중요성을 이해해야합니다. 아무도 그것이 무엇을 의미하는지 말할 수 있습니까?
더 일반적인 질문으로, 나는 많은 문제없이 대부분의 ILDasm 출력을 따라갈 수 있습니다. 그러나 때로는 문제가되는 표현을 자주 접하게됩니다. 예를 들어,
callvirt instance class [EntityFramework]System.Data.Entity.ModelConfiguration.EntityTypeConfiguration`1<!!0> [EntityFramework]System.Data.Entity.DbModelBuilder::Entity<class DynamicEdmxTrial.HardFooAsset>()
ILDASM
에서이 라인에서 "!! 0"아마도 법인 <>의 제네릭 형식을 의미한다, 그러나 나는 확실히 알 수없고, 나는 키가 궁금해 더 희미한 출력을 내게 설명하는 ILDasm 출력.
"Common Language Runtime에서 잘못된 프로그램을 발견했습니다." "어셈블리에서 PEVerify를 실행 해 보셨습니까? – svick
또한 정확히 어떻게 그'.local '을 얻고 있습니까? 둘 다 ILDasm에서 왔습니까? – svick
"잘못된 프로그램"에 대해서는별로 신경 쓰지 않습니다. 나는 그것을 발견했다고 생각한다. 두 가지 .local 선언은 ILDasm에서 나왔습니다. 그것은 분명히 C# 코드와 Reflection.Emit 사이에 약간의 차이점을 발견했습니다. – jrv