Nếu tôi muốn thực hiện công cụ với Mono.Cecil
Tôi thường tạo lớp/phương thức trong C#
với mã mong muốn. Sau đó tôi kiểm tra nó (Hãy chắc chắn rằng bạn đang chạy nó trong chế độ phát hành) với Mono.Cecil
và tái tạo nó.
Vì vậy, bạn cần có một MethodDefinition
với thông số name
, attributes
và returnType
. Tên: "f"
Các thuộc tính cho phương pháp của bạn sẽ là: Mono.Cecil.MethodAttributes.FamANDAssem | Mono.Cecil.MethodAttributes.Family | Mono.Cecil.MethodAttributes.Static | Mono.Cecil.MethodAttributes.HideBySig
Và kiểu trả về (kiểu Mono.Cecil.TypeReference
như System.Double
)
Đối với các thông số, có hai ParameterDefinition
bạn có thể thêm với target.Parameters.Add()
một trong những thông số của bạn có giá trị mặc định để thuộc tính của nó phải Mono.Cecil.ParameterAttributes.Optional | Mono.Cecil.ParameterAttributes.HasDefault
và Constant
bộ của nó để 1.0
(trong trường hợp của bạn)
Bây giờ cho cơ thể phương pháp:
target.Body.GetILProcessor(); // target is your `MethodDefinition` object.
Sau khi kiểm tra các hướng dẫn từ target.Body.Instructions
, chúng ta thấy các mã sau:
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: mul
IL_0003: stloc.0
IL_0004: br.s IL_0007
IL_0005: ldloc.0
IL_0007: ret
Vì vậy, chỉ cần thêm các mã trong chuỗi đúng
processor.Append(OpCodes.Ldarg_0);
Sau đó, hãy tiêm/lưucủa bạn 0 đến hội đồng tương ứng.
đang thanh tra lắp ráp của tôi trông giống như sau:
private static void EnumerateAssembly(AssemblyDefinition assembly)
{
foreach (var module in assembly.Modules)
{
foreach (var type in module.GetAllTypes())
{
foreach (var field in type.Fields)
{
Debug.Print(field.ToString());
}
foreach (var method in type.Methods)
{
Debug.Print(method.ToString());
foreach (var instruction in method.Body.Instructions)
{
Debug.Print(instruction.ToString());
}
}
}
}
}
bạn không bao giờ nên cần phải thêm "nop". Nếu bạn đang nhìn thấy "nop", nó có nghĩa là (luôn luôn) bạn xây dựng trong chế độ gỡ lỗi hơn là chế độ phát hành, trước khi nhìn vào mã trong phản xạ/isdasm/bất cứ điều gì. Sẽ tốt hơn nếu kiểm tra IL từ một bản phát hành. –
@MarcGravell Cảm ơn bạn đã đứng đầu! – Alex
Tôi không chỉ biết về việc đặt Hằng số thành giá trị. Cảm ơn bạn anyway! –