문제

메소드 가져 오기로 제발 도와주세요. 다른 어셈블리에 정의 된 기본 클래스에서 어셈블리를 짜고 메소드 호출 참조를 주입하고 싶습니다 (실제로 직조 코드가 정의되는 어셈블리입니다).

private void InsertCallSetReference()
{
    //Get the load instruction to replace
    var ilProcessor = Property.SetMethod.Body.GetILProcessor();
    var argumentLoadInstructions = ilProcessor.Body.Instructions.ToList();

    MethodReference methodReference = ImportMethod("SetReference");

    foreach (var instruction in argumentLoadInstructions)
    {
        if (instruction.OpCode == OpCodes.Stfld)
        {
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Call, methodReference));
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldarg_1));
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldstr, DBFieldName));
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldarg_0));
            ilProcessor.Remove(instruction);
            break;
        }
    }
}

메소드 가져 오기 코드는 제대로 작동하고 메소드 참조를 반환합니다.

private MethodReference ImportMethod(string name)
{
     var type = MongoConnectModule.Import(typeof(BaseDataObject));
     return MongoConnectModule.Import(type.Resolve().Methods.First(m => m.Name == name));
}

그러나 어셈블리 정의 후 쓴 후에는 오류가 발생합니다.

C : dev mongoconnect weavingtasktest weaving codeweaving.targets (32,5) : 오류 msb4018 : system.argumentexception : member 'system.void mongoconnect.baseAbject :: setProperty (system.string, system.object) 다른 모듈에서 가져와야합니다

_assemblyDefinition.Write(_assemblyPath, new WriterParameters() { WriteSymbols = true, SymbolWriterProvider = debugWriterProvider });

내가 어떻게 할 수 있는지 아십니까?

도움이 되었습니까?

해결책

솔루션을 찾았습니다. 그 이유는 정말 재밌었습니다.

Module.Import() 메소드는 메소드가 정의 된 모듈이 아니라 수정하려는 현재 모듈에서 호출해야합니다. 원본에서 명확하지 않습니다 문서.

예를 들어, 우리는 Referenced.dll 우리에게 조립 Main.dll 집회. 그런 다음 우리는 우리의 주요 모듈을 찾아야합니다 Main.dll 조립 한 다음 전화하십시오 MainModule.Import(methodFromReferencedAssembly);

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