【问题标题】:Dynamically Resolve Dependency at Runtime in C# DLL在 C# DLL 中动态解决运行时的依赖关系
【发布时间】:2016-09-12 20:56:00
【问题描述】:

我有一个 WPF DLL 项目,其中包含我的自定义控件、主题、样式等,它构建为 AnyCPU。

我依赖于一个开源 Web 浏览器控件,它不支持本机 AnyCPU,但有单独的 x86/x64 程序集。

在 EXE 中,这相当简单。我可以处理 64 位进程的 AppDomain.CurrentDomain.AssemblyResolve 事件检查,并使用适当的程序集执行 Assembly.LoadFile。

如何在运行时动态解析 DLL 项目中的依赖关系?

【问题讨论】:

  • 我的问题是,你甚至必须这样做吗?您能否将您的 DLL 项目作为参考添加到您的 EXE 项目中,并为第三方 DLL 解析动态程序集,它会正常工作吗?你有没有尝试过?有什么错误吗?
  • 或者您可能必须将您的 DLL 项目构建为 x86 和 x64 并动态加载它......我对动态分辨率没有太多经验,所以我可能会走得很远,只是试图想出一个解决方案。

标签: c# .net wpf dll .net-assembly


【解决方案1】:

原来是我想多了。

在我的 WPF DLL 中,我有一个使用开源 Web 浏览器控件的自定义控件类。

在自定义控件的静态构造函数中,我为AppDomain.CurrentDomain.AssemblyResolve 事件设置了一个处理程序。

对于我的处理程序:

    private static Assembly Resolver(object sender, ResolveEventArgs args)
    {
        if(args.Name.StartsWith("CefSharp"))
        {
            string assemblyName = args.Name.Split(new[] { ',' }, 2)[0] + ".dll";
            string archSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "CefSharp", Environment.Is64BitProcess ? "x64" : "x86", assemblyName);
            return File.Exists(archSpecificPath) ? Assembly.LoadFile(archSpecificPath) : null;
        }

        return null;
    }

在处理程序中,我检查是否正在解析 CefSharp 程序集,如果是,我会根据我的程序集是否在 64 位进程中运行来创建正确程序集的路径,然后执行 @ 987654323@.

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多