【发布时间】: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