在C#中运行时使用外部resx文件(未嵌入)

时间:2016-12-31 19:08:44

标签: c# .net wpf xaml resx

我有一个应用程序,用户可以通过添加自己的xaml文件来定义自定义元素。这些文件在启动时由应用程序加载。我们的想法是能够扩展应用程序而无需重新编译它。这些元素将在屏幕上显示给用户,xaml文件可能包含资源键,这些资源键不包含在应用程序本身的resx文件中。所以我需要有单独的resx文件供用户编辑,也可以在运行时加载。

我查看过ResourceManager类,我知道可以将其设置为从各种其他程序集中访问资源。但是从我收集到的资源中,资源必须是集会的一部分,这正是我不想要的。我想要的是拥有一堆这样的文件:

  

%ProgramData%\ MyApplication的\资源\ strings.resx

     

%ProgramData%\ MyApplication的\资源\ strings.de-DE.resx

     

%ProgramData%\ MyApplication的\资源\ strings.zh-CN.resx

我希望我的应用程序能够加载这些文件并访问其中的字符串。

本文https://msdn.microsoft.com/en-us/library/gg418542(v=vs.110).aspx显示了使用ResXResourceReader和ResXResourceSet的两种方法。但是,似乎这些类采用特定文件(或流)的路径,因此无法根据当前文化和命名约定选择正确的文件。我知道我可以自己编写代码,如果我找不到更好的解决方案,那就是我要做的事情。但理想情况下,我想要一些可以解决这个问题的方法。例如,如果可以将ResourceManager指向文件夹而不是程序集。这样的事情可能吗?

1 个答案:

答案 0 :(得分:0)

经过长时间的搜索,我发现了这个: 如果我以正确的方式理解您,您希望在运行时使用xaml在WPF中创建用户定义的表单。 我不确定但是,我认为资源文件不会帮助你,因为在程序集中预编译了所有xaml表单。我找到了一些可能听起来像是解决问题的方法。它叫做Sattalite大会。在第一步中,您必须创建一个新的资源文件。第二步是将它与Assembly Linker(Al.exe)链接。 form .net Framework。 MSDN Creating Satellite Assemblies

第一步在运行时创建一个ResourceFile(这里有点帮助)

 public static void CreateResourceFile()
            {
                string resourceFileName = "externeresource";

                    System.Xml.XmlDocument xmldoc = new XmlDocument();
                    XmlTextReader reader = new XmlTextReader("/runtimeWPForm.xml");
                    reader.WhitespaceHandling = WhitespaceHandling.None;
                    xmldoc.Load(reader);

                    ResourceWriter resourceWriter = new ResourceWriter(resourceFileName);
/*Add XmlDocument must be Serializable to store it in     
                    resourceWriter.AddResource("xamlgrid", xmldoc.ToString());   
the Resource, so i stored a String here. (not testet)*/
                    resourceWriter.Close();

                    MessageBox.Show("File " + resourceFileName + " created");
                    reader.Close();

            }

第二步,使用Assembly Linker Al.exe从资源文件创建Sattlelite程序集

最后一步是从Sattalite Assembly加载xaml Forms(这里有点帮助)

Uri GridUri = new Uri(/*Note1*/, UriKind.Relative);
Windows.Resources.StreamResourceInfo sri = Application.GetResourceStream(GridUri);
System.Windows.Markup.XamlReader xrdr = new System.Windows.Markup.XamlReader();
Grid grd = (Grid)xrdr.LoadAsync(sri.Stream);
this.Content = grd;

注1: 资源文件 - 引用程序集Pack URIs in WPF

Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml",UriKind.Relative);

这里有一些有用的信息,我想Construct XAML Forms at Runtime with Resource Files

这是我找到的所有内容,并不保证功能。 我很感兴趣,如果这对您有用,请发送成功答案或者您是否解决了问题。

PS。:如果这样可行,我认为您只需重新启动主应用程序即可加载新的sattalite组件。也许你必须启动一个执行该工作的ohter应用程序,并在完成后再次自动启动主应用程序。

最好的reg GatewayToCode