.NET:通过反射获取资源

3
我该如何从当前程序集动态获取所有资源?我已经尝试了两种方法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",或者所有必需的卫星程序集都可以加载和完全签名。

解决方案(根据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个回答

3

是的,在MyNameSpace.Resources.resource中有不止一个资源。这就是你必须传递给ResourceManager的名称,空字符串是行不通的。

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


在示例代码的查找提示上加1。有时我甚至没有意识到它的存在,但我总是发现它非常有用。 - Merlyn Morgan-Graham
问题:为什么我使用“vbc /t:exe myfile.vb /res:myresouce1 /res:myresource2”编译时,可以通过GetManifestResourceNames获取所有资源,但是当我使用IDE时,它们都被隐藏了? - user295190
取消操作... Resgen 将生成一个 resx 文件。 - user295190
IDE将它们合并成一个由Resgen.exe生成的单一.resource文件,这是正确的做法。您的命令行类似于使用“项目+添加现有项”并选择一个文件,然后将其构建操作设置为“嵌入式资源”。如果您有更多问题,请启动另一个线程。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接