GetManifestResourceStream()项必须在资源中吗?

时间:2018-02-06 20:34:04

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

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

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

Ans总是没有。 GetManifestResourceStream对我来说有点黑盒子,如果在“root”中找到这个资源可以吗?如果是这样,我的名字是否正确,或者我需要某种路径吗?

更新:根据迈克尔的建议,我这样做了:

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

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

1 个答案:

答案 0 :(得分: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)