获得“System.IO.FileNotFoundException"使用单声道后出现错误.塞西尔修改了组装

本文关键字:错误 修改 声道 FileNotFoundException IO System quot 单声道 获得 | 更新日期: 2023-09-27 18:02:09

为了重现这个问题,我创建了这样一个简单的类,这个文件将被编译为"SourceDLL.dll"

namespace SourceDll
{
    public class Class1
    {
        static public int Add(int b, int c)
        {
            return b + c;
        }
    }
}

然后我使用单声道。塞西尔,修改一下,我只是打开并保存。

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"文件,然后我尝试使用这个文件。创建一个控制台应用程序并引用" sourcedll . patch .dll"

namespace TestInstrumentDll
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Class1.Add(1, 1));
        }
    }

}

不幸的是,我得到了这样的错误:

未处理异常:System.IO.FileNotFoundException: Could not load file or ass编译' sourcedell, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'或1它的依赖关系。系统找不到指定的文件。在TestInstrumentDll.Program。Main (String [] args)

如果我切换到原来的SourceDll.dll,它工作并打印一个数字"2",正如我们所期望的。

获得“System.IO.FileNotFoundException"使用单声道后出现错误.塞西尔修改了组装

这与Mono无关。塞西尔图书馆。这与CLR搜索程序集的方式有关。程序集名称被写入程序集的元数据中,CLR将查看元数据以查找程序集。您可以通过将程序集从SourceDLL.dll重命名为SourceDLL2.dll,然后引用重命名后的程序集(Mono)来轻松地测试它。塞西尔没有参与!)。您可以看到,您将得到完全相同的异常。

要使其工作,您需要在编写程序集之前更改程序集名称:

var assembly = AssemblyDefinition.ReadAssembly(assemblyPath));
assembly.Name.Name += ".Patched";
assembly.Write(assemblyPath.Replace(".dll", ".Patched.dll"));