2

問題を再現するために、このような単純なクラスを作成しました。このファイルは「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」が出力されます。

4

1 に答える 1

5

これは Mono.Cecil ライブラリとは関係ありません。これは、CLR がアセンブリを検索する方法に関連しています。アセンブリ名はアセンブリのメタデータに書き込まれ、CLR はメタデータを調べてアセンブリを見つけます。SourceDLL.dllアセンブリの名前を から に変更し、名前を変更したアセンブリを参照するだけで簡単にテストできますSourceDLL2.dll(Mono.Cecil は関係ありません!)。まったく同じ例外が発生することがわかります。

機能させるには、書き込む前にアセンブリ名を変更する必要があります。

var assembly = AssemblyDefinition.ReadAssembly(assemblyPath));
assembly.Name.Name += ".Patched";
assembly.Write(assemblyPath.Replace(".dll", ".Patched.dll"));
于 2013-03-04T14:46:15.503 に答える