Я работаю с внешней библиотекой, в которой есть ошибка. Я отследил ошибку, и это неправильное приведение, похожее на:
var projectionBufferBase = startBuffer as IProjectionBuffer;
Где это должно быть:
var projectionBufferBase = startBuffer as IProjectionBufferBase;
Глядя на IL, это представлено как:
isinst Microsoft.VisualStudio.Text.Projection.IProjectionBuffer
Я использовал Mono.Cecil, чтобы загрузить DLL и найти строки, которые я хотел бы изменить, но я не уверен, как изменить операнд, прежде чем сохранять DLL обратно на диск.
MethodDefinition brokenMethod = ...
foreach (var item in brokenMethod.Body.Instructions)
{
//Find the instruction with the incorrect operand
if (item.Operand != null && item.Operand.ToString() == "Microsoft.VisualStudio.Text.Projection.IProjectionBuffer")
{
Console.WriteLine(item);
//What do I assign here? It can't be a string.
item.Operand = ...
}
}
assemblyDefinition.Write(@"C:\Users\...\DirectoryWithDLLs\newDLL.dll");
item.Operand
принимает объект, но если я задаю его как строку, происходит сбой при записи DLL на диск. Могу ли я заменить операнд? Или мне создать совершенно новую инструкцию IL и заменить старую?