問題を再現するために、このような単純なクラスを作成しました。このファイルは「SourceDLL.dll」としてコンパイルされます。
namespace SourceDll
{
public class Class1
{
static public int Add(int b, int c)
{
return b + c;
}
}
}
次に、Mono.Cecil を使用して変更し、開いて保存します。
namespace InstrumentSystemDll
{
class Program
{
static void Main(string[] args)
{
var fileName = args[0];
var assembly = AssemblyDefinition.ReadAssembly(string.Format(@"..\..\..\Dependences\{0}.dll", fileName));
Console.WriteLine(string.Format(@"..\..\..\Dependences\{0}.Patched.dll", fileName));
assembly.Write(string.Format(@"..\..\..\Dependences\{0}.Patched.dll", fileName));
}
}
}
変更された「SourceDll.Patched.dll」ファイルを取得したので、このファイルを使用しようとしました。consloe アプリを作成し、「SourceDll.Patched.dll」を参照します。
namespace TestInstrumentDll
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Class1.Add(1, 1));
}
}
}
残念ながら、次のようなエラーが発生しました。
未処理の例外: System.IO.FileNotFoundException: ファイルまたは ass embly 'SourceDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。TestInstrumentDll.Program.Main (文字列 [] args) で
元の SourceDll.dll に切り替えた場合、期待どおりに機能し、数値「2」が出力されます。