문제

모듈 초기화기는 C# 또는 vb.net에서 직접 사용할 수없는 CLR의 기능입니다. 그것들은 전 세계 정적 방법입니다 .cctor 이는 어셈블리의 다른 코드 (유형 초기화기, 정적 생성자)가 실행되기 전에 실행되도록 보장됩니다. 나는 최근에 프로젝트에서 이것을 사용하고 싶었고 내 자신의 솔루션을 해킹했습니다 (콘솔 프로그램/MSBuild 작업) mono.cecil을 사용하지만 궁금합니다.

  1. C# 컴파일러를 방출 모듈 강화제로 속이는 방법이 있습니까? 어떤 속성 (예 : 컴파일러 된, 스페셜 이름) 또는 사용될 수있는 기타 속임수가 있습니까?

  2. c# / vb.net이 어떤 목적 으로이 초기화 자 스스로 방출 되는가? 내가 본 것에서 그것들은 일부 인터 로프 목적으로 관리 된 C ++에 의해 사용되지만 다른 목적으로 사용되는 것에 대한 언급을 찾을 수 없었습니다. 어떤 아이디어?

도움이 되었습니까?

해결책

C#은 클래스/struct에 모든 것을 넣고 모듈 초기화기가 글로벌이어야하기 때문에 C#에서이를 방출 할 방법이 없습니다.

다른 도구를 사용하여 작성해야합니다.

두 번째 질문에 관해서는, 나는 모른다는 것을 인정해야하지만 C#에 의해 생성 된 것을 본 적이 없으며 Idlasm을 자주 사용하기 때문에 방출하지 않는다고 가정합니다.

다른 팁

Awesome OpenSource IL-Weaver 프로젝트의 모듈 초기 라이저 애드온을 확인하십시오. "Fody", Simon Cropp의 작성 : https://github.com/fody/moduleinit

Fody에 의해 어셈블리 이니셜 라이저로 변환되는 메소드를 지정할 수 있습니다.

public static class ModuleInitializer
{
    public static void Initialize()
    {
        //Init code
    }
}

이것을 얻는다 :

static <Module>()
{
    ModuleInitializer.Initialize();
}

아마도 System.Reflection.Emit 네임 스페이스가 도움이 될 수 있습니다. MethodAttributes 열거에는 유사한 요소가 포함되어 있습니다 (SpecialName, RTSpecialName).

Einar, 귀하의 질문은 이미 이미 컴파일 된 어셈블리에 모듈 이니셜 라이저를 주입 할 수있는 도구를 이미 작성했음을 분명히하지 않았습니다.

http://einaregilsson.com/module-initializers-in-csharp

나는 당신의 응용 프로그램을 시도했고 그것은 완벽하게 작동합니다. 글을 쓸 때 2 ~ 4.5의 모든 현재 프레임 워크에서 작동해야합니다.

솔루션이 저에게 쓸모가없는 문제는 단 하나뿐입니다. 응용 프로그램이 처음에 어셈블리에 액세스 할 때 이니셜 라이저가 호출됩니다.

내가 필요한 것은 어셈블리가 프로세스에로드 될 때 모듈 초기 라이저를 즉시 호출해야한다는 것입니다. 그러나 그렇지 않습니다. 따라서 응용 프로그램이 어셈블리에 액세스하지 않으면 초기화되지 않습니다.

하루 종일 조사한 후 이것을 얻는 유일한 방법은 관리되는 C ++ 어셈블리를 작성하고 dllmain ()에서 코드를 실행하는 것입니다.

정적 생성자 또는 싱글 톤 클래스가있는 경우 true에 액세스 할 수있는 정적 변수 C# 컴파일러가 .cctor를 방출합니다.

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