.NET:通过反思获取资源

时间:2010-09-04 20:37:03

标签: .net reflection resources assemblies

如何从当前程序集中动态获取所有资源?我尝试了两种方法,GetManifestResourceNames和GetResourceSet都没有成功。我对VB.net或C#中的解决方案很满意。

第一种方法

第一种方法只返回长度为1的数组,其值为“MyNameSpace.Resources.resource”。问题是此文件中有多个资源。

Dim ca As Assembly = Assembly.GetExecutingAssembly
Dim rn() As String = CurrentAssembly.GetManifestResourceNames()

第二种方法

Dim ca As Assembly = Assembly.GetExecutingAssembly
Dim crm As New ResourceManager("", ca)
''//Dim CurrentResourceManager As New ResourceManager(_
         "MyNamespace.Resources.resources", CurrentAssembly)
''//Dim CurrentResourceManager As New ResourceManager( _
         "My.Resources", CurrentAssembly)
Dim rs As ResourceSet = CurrentResourceManager.GetResourceSet(CultureInfo.CurrentCulture, True, True)
Dim rs As ResourceSet = crm.GetResourceSet( _
              CultureInfo.CurrentCulture, True, True)

MissingManifestResourceException未处理

  

无法找到任何资源   适合指定的文化   或中性文化。确保   “.resources”被正确嵌入或   链接到程序集“MyProgram”   在编译时,或所有的   所需的卫星组件是   可加载和完全signed.loadable和完全签名。

解决方案(根据Hans Passant的说法)

从Resources.Designer.vb

复制命名空间
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
            Get
                If Object.ReferenceEquals(resourceMan, Nothing) Then
                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("MyNamespace.Resources", GetType(Resources).Assembly)
                    resourceMan = temp
                End If
                Return resourceMan
            End Get
        End Property

并将其放在代码中

Dim CurrentResourceManager As New ResourceManager( _
         "MyNamespace.Resources", CurrentAssembly)
Dim rs As ResourceSet = CurrentResourceManager.GetResourceSet( _
         CultureInfo.CurrentCulture, True, True)

1 个答案:

答案 0 :(得分:3)

是的, MyNameSpace.Resources.resource 中有超过1个资源。您必须传递给ResourceManager的名称是什么,空字符串不起作用。

要查看必须编写的代码类型,请启动Windows窗体应用程序并向Project + Properties,Resources选项卡添加一些资源。在解决方案资源管理器中,单击“显示所有文件”图标。打开My Project节点,打开Resources.resx节点,然后双击Resources.Designer.vb文件。请注意ResourceManager属性的代码。