【问题标题】:.NET: Get Resources by Reflection.NET:通过反射获取资源
【发布时间】:2010-09-04 20:37:02
【问题描述】:

如何从当前程序集中动态获取所有资源?我尝试了两种方法,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)

【问题讨论】:

    标签: .net reflection resources assemblies


    【解决方案1】:

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

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

    【讨论】:

    • +1 提示在哪里查找示例代码。有时我什至没有意识到它的存在,但我总是觉得它非常有用。
    • 问题:为什么当我使用“vbc /t:exe myfile.vb /res:myresouce1 /res:myresource2”编译时,我可以使用 GetManifestResourceNames 获取所有资源,但是当我使用 IDE 时,它们是全部隐藏?
    • 取消... Resgen 将生成一个 resx 文件。
    • IDE 将它们组合成一个由 Resgen.exe 生成的 .resource。这是正确的做法。您的命令行类似于使用 Project + Add Existing Item 并选择一个文件,然后将其 Build Action 设置为“Embedded Resource”。如果您有更多问题,请启动另一个线程。
    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多