سؤال

ساعدني من فضلك مع استيراد الطريقة. أرغب في نسج التجميع وحقن طريقة استدعاء الطريقة من الفئة الأساسية المحددة في التجميع الآخر (في الواقع هو التجميع حيث يتم تعريف رمز النسيج).

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));
}

ولكن بعد التعرف على assemblyDefinition ، اتصل بي خطأ:

C: dev mongoconnect waevingtasktest weaving codeweaving.targets (32،5): خطأ msb4018: System.ArgumentException: system.void mongoconnect.baseObject :: 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