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

Do GetManifestResourceStream() items have to be in Resources?

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

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

Ans 永远是Nothing。 GetManifestResourceStream 对我来说有点黑框,如果在 "root" 中可以找到这个资源?如果是这样,我的名字是否正确,或者我需要某种路径吗?

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

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

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

如果您希望依赖 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)