能否在运行时创建绑定重定向?

11

一旦应用程序启动,有没有一种方法可以创建一个绑定重定向,使其适用于所有未来的程序集加载?


3
为什么你需要这个?你想要实现什么目标? - Darin Dimitrov
所有未来的加载是什么意思? - František Žiačik
1
@Simon:这是不是可以使用 AppDomain.AssemblyResolve 事件来解决? - František Žiačik
@Simon,我现在遇到了完全相同的问题。你找到解决方案了吗? - Cory Nelson
@CoryNelson 不是。我将 Gael 的答案标记为正确,因为它似乎是正确的方法。但我无法实现这个。 - Simon
显示剩余5条评论
2个回答

12

抱歉回复一篇旧文章,但是这篇博客对这个问题有更好的答案。希望有人会发现它很有用。

我的使用情况:从经典ASP应用程序调用的COM互操作程序集进行绑定重定向。

http://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/

该问题的帖子中的此函数将实现您想要的功能:

public static void RedirectAssembly(string shortName, Version targetVersion, string publicKeyToken) {
    ResolveEventHandler handler = null;

    handler = (sender, args) => {
        // Use latest strong name & version when trying to load SDK assemblies
        var requestedAssembly = new AssemblyName(args.Name);
        if (requestedAssembly.Name != shortName)
            return null;

        Debug.WriteLine("Redirecting assembly load of " + args.Name
                      + ",\tloaded by " + (args.RequestingAssembly == null ? "(unknown)" : args.RequestingAssembly.FullName));

        requestedAssembly.Version = targetVersion;
        requestedAssembly.SetPublicKeyToken(new AssemblyName("x, PublicKeyToken=" + publicKeyToken).GetPublicKeyToken());
        requestedAssembly.CultureInfo = CultureInfo.InvariantCulture;

        AppDomain.CurrentDomain.AssemblyResolve -= handler;

        return Assembly.Load(requestedAssembly);
    };
    AppDomain.CurrentDomain.AssemblyResolve += handler;
}

2

使用ICLRHostBindingPolicyManager::ModifyApplicationPolicy可能是可能的,但我从未尝试过。请注意,这是一个CLR级别的接口,因此您无法为单个AppDomains加载策略(这就是为什么PostSharp尚未使用它的原因)。

http://msdn.microsoft.com/en-us/library/ms164378.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接