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)
我复制了一个文件,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)