저에게 적합한 솔루션으로 업데이트되었습니다. 이 질문의 맨 아래를보십시오..NET Core & Xamarin을 사용하여 IL에서 컴파일 된 어셈블리 사용
컨텍스트 :
나는 특정 바이트 크기에 맞도록 배열의 길이를 계산하기위한 제네릭 형식의 크기를 평가하는 방법이 필요했습니다. 기본적으로 sizeof
은 C/C++에서 제공하는 것과 유사합니다.
C#의 sizeof
및 Marshal.SizeOf은 많은 제한 사항 때문에 적합하지 않습니다.
이것을 염두에두고 필자는 IL에서 sizeof
opcode를 통해 찾고 있던 기능을 사용할 수있는 어셈블리를 작성했습니다. 참조 유형이 본질적으로 IntPtr.Size
인 것으로 알고 있습니다.
.NET 표준 & 코어 용으로 복제했습니다. mscorlib에 해당하는 정확한 내용을 참조하십시오. 일리노이가 잘 컴파일된다는 것에 유의하십시오.이 질문은 다른 문제입니다.
코드 : 대상 프레임 워크 당
헤더 :
.NET : (윈도우 \ Microsoft.NET 프레임 워크 \ \ v4.0.30319 Ilasm.exe를 \)
.assembly extern mscorlib {}
.NET 표준 : (nuget 추출 ILASM)
.assembly extern netstandard
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
.ver 0:0:0:0
}
.assembly extern System.Runtime
{
.ver 0:0:0:0
}
.NET 코어 (표준 동일 ILASM하지만
이.assembly Company.IL
{
.ver 0:0:1:0
}
.module Company.IL.dll
// CORE is a define for mscorlib, netstandard, and System.Runtime
.class public abstract sealed auto ansi beforefieldinit
Company.IL.Embedded extends [CORE]System.Object
{
.method public hidebysig specialname rtspecialname instance void
.ctor() cil managed
{
.maxstack 8
ldarg.0
call instance void [CORE]System.Object::.ctor()
ret
}
.method public hidebysig static uint32
SizeOf<T>() cil managed
{
sizeof !!0
ret
}
}
문제 : 나는
.assembly extern System.Runtime
{
.ver 0:0:0:0
}
는 소스)를 모두 테스트 한 이러한 방식으로 컴파일 된 모든 DLL이 .NET 코어 또는 자 마린 응용 프로그램에서 참조
, 내가받는 다음 오류 :
The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
이러한 DLL은 .NET 프로젝트에서 참조하거나 NET 표준 라이브러리는 .NET 프로젝트에서 참조합니다.
다른 버전과 어셈블리에서이 오류에 대해 자세히 설명한 수많은 기사, 게시물 및 리포지토리를 읽었습니다. 일반적인 솔루션은 대상 프레임 워크의 mscorlib (이동이 용이함)에 해당하는 것에 대한 명시적인 참조를 추가하는 것으로 보입니다. .NET 표준 & 코어 용 IL 컴파일 어셈블리 사용에 대한 정보가 부족한 것 같습니다.
내 이해에 따르면 .NET 표준 & 코어는 대상 형식 프레임 워크의 런타임에 의해 유형 정의가 전달 될 수 있도록 전달 형식을 정의하여 이식성을 가능하게합니다.동일한 참조를 사용하여 C#을에서 컴파일 System.Runtime
- 명시 버전 :
나는 다음을 시도했습니다. 이상하게도 명시 적 버전 (예 : .NET Core 2.0의 System.Runtime 4.2)을 대상으로하는 것으로 보입니다.
- Emit API을 사용하여 동적으로 코드를 생성합니다. 메모리로 컴파일하는 것은 작동하지만 나도 Xamarin.iOS (AOT 만)를 타겟팅하기 때문에 옵션이 아닙니다. 동적으로 컴파일 된 어셈블리를 디스크에서 참조하면 수동으로 컴파일 한 것과 같은 오류가 발생합니다.
업데이트 : (빌드 지침 here 다음) Jacek's answer에서 솔루션을 시도, 아직 통해 파고 후, 빌드 스크립트 나 그러나 VS 2017와 corefx를 컴파일 내 시스템을 구성 할 수
코드 System.Runtime.CompilerServices.Unsafe 해결책을 발견했습니다.
아마도 이것은 분명해 보이지만 나는 System.Runtime
의 잘못된 버전을 참조하고있었습니다. (corefx에서 복사) 대상 프레임 워크 당
헤더 :
.NET :
#define CORELIB "mscorlib"
.assembly extern CORELIB {}
.NET 표준 :
#define CORELIB "System.Runtime"
#define netcoreapp
// Metadata version: v4.0.30319
.assembly extern CORELIB
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A)
.ver 4:0:0:0
}
.NET 코어 :
#define CORELIB "System.Runtime"
// Metadata version: v4.0.30319
.assembly extern CORELIB
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A)
.ver 4:0:0:0
}
모든 소스 파일에서 0123을 사용하십시오. mscorlib의 참조 유형에 대해(예 : [CORELIB]System.Object
).
'Reflection.Emit' 시도의 결과는 무엇입니까? – thehennyy
@thehennyy 자세한 내용이 업데이트되었습니다. –
@ KobyDuck : IL 전용 어셈블리를 참조하는 프로젝트에서 컴파일 오류를 억제하기위한 옵션을 추가했습니다. 이것은 도움이 될 수도 있습니다. –