【问题标题】:Is it possible to create a binding redirect at runtime?是否可以在运行时创建绑定重定向?
【发布时间】:2011-08-04 12:22:48
【问题描述】:

一旦应用程序启动,有没有办法创建一个绑定重定向,该重定向将应用于所有未来的程序集加载?

【问题讨论】:

  • 为什么需要这个?你想达到什么目的?
  • 所有未来的负载是什么意思?
  • @darin。那是“我不知道”吗?这是一个相当复杂的案例,不值得在这里解释。
  • @František 程序集在域上加载。所以我想控制在应用程序生命周期内何时加载程序集的绑定
  • @Simon: 你可以使用AppDomain.AssemblyResolve 事件吗?

标签: .net assembly-resolution


【解决方案1】:

很抱歉回复了一篇旧帖子,但这个博客对这个问题有更好的答案。希望有人觉得它有用。

我的用例:从由经典 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 级别的接口,因此您无法为单个 AppDomain 加载策略(这就是 PostSharp 尚未使用它的原因)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-09
      • 2017-06-01
      • 2022-11-08
      • 2012-03-24
      • 2021-10-01
      • 2022-11-01
      • 2016-05-11
      • 2015-03-07
      相关资源
      最近更新 更多