【问题标题】:Do GetManifestResourceStream() items have to be in Resources?GetManifestResourceStream() 项目是否必须在资源中?
【发布时间】:2018-02-06 20:34:04
【问题描述】:

我将一个文件 vbaProject.bin 复制到我的 VS.net 项目的根目录中(我希望它高度可见,而不是在子文件夹中)。我选择了它并将 Build Action 设置为 Embedded Resource。然后我在我的代码中做了这个......

App = System.Reflection.Assembly.GetExecutingAssembly()
Ans = App.GetManifestResourceStream("vbaProject.bin")

Ans 永远是空。 GetManifestResourceStream 对我来说有点像黑匣子,如果在“根”中找到这个资源可以吗?如果是这样,我的名字是正确的,还是我需要某种路径?

更新:按照迈克尔的建议,我这样做了:

App = System.Reflection.Assembly.GetExecutingAssembly()
Ans = App.GetManifestResourceStream(App.GetName().ToString().Split(","c)(0) & ".vbaProject.bin")

这是一个安全的解决方案吗?

【问题讨论】:

  • 作为调试辅助,调用 GetManifestResourceNames() 并检查结果以确保资源正确嵌入了您期望的名称。
  • @MichaelLiu - 非常有用!我找到了它,“CBLDynaTools.vbaProject.bin” 那么如何获得“CBLDynaTools”部分以便我可以建立名称?

标签: vb.net visual-studio .net-assembly


【解决方案1】:

如果您希望依赖 Visual Studio 的行为,那么您可以执行以下操作:

Dim asm As Assembly = Assembly.GetExecutingAssembly
Dim firstType As Type = asm.GetTypes(0)
Dim rootNamespace As String = firstType.Namespace
Dim myFileName As String = "something.bin"
Dim strm As IO.Stream = asm.GetManifestResourceStream(rootNamespace & "." & myFileName)

这依赖于 Visual Studio 将根命名空间预先附加到嵌入文件名称的行为。

更好的解决方案是修改ProjectName.vbproj 文件(MS Build 文件)以指定您要使用的确切名称。您应该会找到包含嵌入文件的指令的 <ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="DirectoryPath\something.bin" />
  </ItemGroup>

更改上述内容以指定将提供要使用的名称的LogicalName 标记。

  <ItemGroup>
    <EmbeddedResource Include="DirectoryPath\something.bin">
      <LogicalName>something.bin</LogicalName>
    </EmbeddedResource>
  </ItemGroup>

关闭 Visual Studio 并在文本编辑器中编辑 ProjectName.vbproj。当您在 Visual Studio 中加载项目时,将保留此更改。

通过此更改,现在您可以像这样获取流:

Dim myFileName As String = "something.bin"
Dim strm As IO.Stream = asm.GetManifestResourceStream(myFileName)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 2020-02-15
    • 1970-01-01
    • 2020-10-26
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多