.NET:通过反射获取资源

.NET:通过反射获取资源,.net,reflection,resources,assemblies,.net,Reflection,Resources,Assemblies,如何从当前程序集中动态获取所有th资源?我尝试了两种方法,GetManifestResourceName和GetResourceSet,但都没有成功。我对VB.net或C#中的解决方案很熟悉 第一种方法 Dim ca As Assembly = Assembly.GetExecutingAssembly Dim crm As New ResourceManager("", ca) ''//Dim CurrentResourceManager As New ResourceManager(_

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

第一种方法

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)
第一个方法仅返回长度为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异常

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)
找不到任何资源 适合于指定的区域性 或者是中立文化。确保 “.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

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


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

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