动态加载外部程序集中的资源并查找同一目录中的引用

时间:2017-06-21 14:34:42

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

我目前正在开展一个项目,我想自动构建另一个Visual Studio解决方案的样式项目中定义的所有样式的展示。

为此,我从运行时通过{strong>其他解决方案OpenFileDialog文件夹中的bin/Debug选择Styling.dll,将其资源添加到我的应用程序资源中,然后建立意见。这很好用,但现在我选择一个引用其他几个组件的程序集时遇到了问题。

这就是我现在加载程序集的方法:

    public void OpenFile()
    {
        var openFileDialog = new OpenFileDialog { Filter = "DLL Dateien (*.dll)|*.dll" };
        if (openFileDialog.ShowDialog() == true)
        {
            var path = Path.GetDirectoryName(openFileDialog.FileName);
            foreach (var dll in Directory.GetFiles(path, "*.dll").Where(dll => dll != openFileDialog.FileName && !dll.ToString().ToLower().Contains("datagrid")))
            {
                this.LoadResources(dll, false);
            }

            this.LoadResources(openFileDialog.FileName);
        }
    }

我放入foreach首先加载一个随附Styling.dll的Utils.dll,但如果有多个其他程序集相互引用,那么这显然不起作用。

然后在LoadResources

    public void LoadResources(string assemblypath)
    {
        var assembly = Assembly.LoadFile(assemblypath);
        var stream = assembly.GetManifestResourceStream(assembly.GetName().Name + ".g.resources");
        if (stream != null)
        {
            var resourceReader = new ResourceReader(stream);

            foreach (DictionaryEntry resource in resourceReader)
            {
                // Get all the .baml files from the .dll and create URI for corresponding .xaml files
                if (new FileInfo(resource.Key.ToString()).Extension.Equals(".baml"))
                {
                    var uri = new Uri("/" + assembly.GetName().Name + ";component/" + resource.Key.ToString().Replace(".baml", ".xaml"), UriKind.Relative);

                    // Add ResourceDictionary to Application Resources
                    var rd = Application.LoadComponent(uri) as ResourceDictionary;

                    if (rd != null)
                    {
                        Application.Current.Resources.MergedDictionaries.Add(rd);
                    }
                }
            }
        }
    }

注意:异常始终在var rd = Application.LoadComponent(uri) as ResourceDictionary;点处抛出。

现在,如何让我的应用程序正确加载目录中的所有其他程序集?现在,我总是收到一个错误,告诉我无法找到其他程序集,即使它们与引用程序集位于同一目录中。

在寻找解决方案一段时间后,我明白应用程序会自动尝试查找缺少的程序集,但不会在实际所在的目录中进行搜索。 由于我想动态加载程序集,我也不能事先向app.config添加其他搜索路径,我可以在运行时以某种方式执行吗?

我希望你理解我的问题,感谢任何帮助,谢谢!

修改

我已阅读this question,但它对我没有任何帮助。 当我实现AssemblyResolve事件时,即使assemblypath中的文件存在,我仍然会获得FileNotFound / XamlParse异常。 此外,处理程序总是尝试查找xxx。资源 .dll文件,另一方面,目录中不存在这些文件。

0 个答案:

没有答案