C# 试图伪造强名称程序集,但是;清单定义不匹配";

C# 试图伪造强名称程序集,但是;清单定义不匹配";,c#,.net,appdomain,.net-assembly,interception,C#,.net,Appdomain,.net Assembly,Interception,我想拦截插件和主机程序集之间的通信 我尝试将ThirdPartyPlugin.dll加载到沙盒(下面的代码)中,以拦截其加载HostLibrary.dll程序集的尝试(我正在使用技巧处理事件)。我不再使用原始的HostLibrary.dll,而是尝试使用一些不同的功能注入一个伪库 不幸的是,原始的HostLibrary.dll是一个强名称程序集,因此我认为在我的程序中会出现异常,如下所示: 未处理的异常:System.IO.FileLoadException:无法加载文件或程序集“HostLib

我想拦截插件和主机程序集之间的通信

我尝试将
ThirdPartyPlugin.dll
加载到沙盒(下面的代码)中,以拦截其加载
HostLibrary.dll
程序集的尝试(我正在使用技巧处理事件)。我不再使用原始的
HostLibrary.dll
,而是尝试使用一些不同的功能注入一个伪库

不幸的是,原始的
HostLibrary.dll
是一个强名称程序集,因此我认为在我的程序中会出现异常,如下所示:

未处理的异常:System.IO.FileLoadException:无法加载文件或程序集“HostLibrary,Version=7.0.0,Culture=neutral,PublicKeyToken=1a2b3c4d5e6f7890”或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。(来自HRESULT:0x8013100的异常)--->System.IO.FileLoadException:找到的程序集的清单定义与程序集引用不匹配。(来自HRESULT的异常:0x8013100)

我创建的伪程序集与原始程序集的名称(
“HostLibrary”
)和版本(
“7.0.0.0”
)不匹配;有一段时间,我认为我甚至让它看起来与
PublicKeyToken
匹配(当我打印时,它是相同的),但异常仍然发生

你对我如何解决这个问题有什么想法吗?有可能解决吗?这是因为数字签名还是其他原因?如果是签名,那么是否可以禁用检查?事实上,从阅读来看,我认为我不应该真的有这个问题。。。那怎么了

代码是:

static void Main(string[] args)
{
    AppDomainSetup setup = new AppDomainSetup();
    setup.ApplicationName = "WrapperBuddy";
    setup.ApplicationBase = System.Environment.CurrentDirectory;

    AppDomain sandbox = AppDomain.CreateDomain("SandboxBuddy", null, setup);
    sandbox.AssemblyResolve += delegate(object sender, ResolveEventArgs args)
    {
        String name = new AssemblyName(args.Name).Name;
        return BuildFakeAssembly(name);
    };

    sandbox.DoCallBack(delegate()
    {
        Assembly plugin = LoadAssembly(PLUGIN_DIR, "ThirdPartyPlugin");
        System.Console.WriteLine(plugin.GetExportedTypes());   // (1)
    });
}
辅助函数定义为:

static Assembly LoadAssembly(String dir, String name)
{
    string path = Path.Combine(dir, name) + ".dll";
    return Assembly.Load(File.ReadAllBytes(path));
}

static Assembly BuildFakeAssembly(String name)
{
    AssemblyName aName = new AssemblyName(name);
    // see: http://msdn.microsoft.com/en-us/library/w58ww7se%28v=vs.85%29.aspx
    // http://msdn.microsoft.com/en-us/library/w58ww7se%28v=vs.100%29.aspx
    aName.KeyPair = new StrongNameKeyPair(new FileStream(@"MyKey.snk", FileMode.Open));
                                  // MyKey.snk is a random key generated using sn.exe
    aName.Version = new Version("7.0.0.0");
    //aName.SetPublicKeyToken(new byte[] { 0x11, 0x22, ... }); // didn't help 

    AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
        aName, AssemblyBuilderAccess.RunAndSave);

    ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
    return ab;
}

如果有任何帮助,我将不胜感激。

为什么要投-1票??如果你有什么意见,请发表评论…如果程序集已签名,我认为你不应该制作假版本。这正是强命名旨在防止的类型。你如何设置传递给AppDomain.CreateDomain的AppDomainSetup对象?@Panosrontgiannis:嗯,我在清理用于发布的代码时意外删除了它。我现在又加了回去,谢谢你的注意。