使用Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream,程序叫PMTS,资源文件叫ExcelDatas.resx,下面有个叫ExcelData.xlsx,为什么返回null
时间: 2024-03-21 20:41:46 浏览: 12
如果您的程序集名为 `PMTS`,资源文件名为 `ExcelDatas.resx`,并且其中包含名为 `ExcelData.xlsx` 的 Excel 文件资源,那么获取资源流的代码应该如下所示:
```
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PMTS.ExcelDatas.ExcelData.xlsx");
```
在这里,资源的完整名称字符串由三部分组成:程序集名 `PMTS`、资源文件名 `ExcelDatas.resx` 和资源的名称 `ExcelData.xlsx`。请注意,资源文件名和资源名称之间使用点号 `.` 进行分隔。
如果返回的结果是 null,那么有可能是资源名称不正确或者资源文件没有正确嵌入到程序集中。您可以使用 Visual Studio 中的资源管理器查看程序集中的嵌入式资源文件列表,确认资源名称是否正确,并检查项目属性中的“生成操作”是否设置为“嵌入的资源”。同时,您也可以尝试使用资源管理器重新导入资源文件,并重新构建程序集。
相关问题
Stream stream = assembly.GetManifestResourceStream要填写什么内容
在调用 `GetManifestResourceStream` 方法时,您需要传入一个字符串参数,该参数指定了要获取的嵌入式资源的名称。这个名称通常由两部分组成:程序集的默认命名空间和资源的名称(或嵌入路径)。
假设您的程序集名为 `MyAssembly`,默认命名空间为 `MyNamespace`,并且您想要获取名为 `PMTS.ExcelData.xlsx` 的 Excel 文件资源,那么可以使用以下代码:
```
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNamespace.PMTS.ExcelData.xlsx");
```
在这里,我们首先使用 `Assembly.GetExecutingAssembly()` 方法获取当前正在执行的程序集,然后使用 `GetManifestResourceStream` 方法传入资源的完整名称字符串,即 `MyNamespace.PMTS.ExcelData.xlsx`。请注意,在这里不需要指定文件的物理路径,只需要使用它在程序集中的名称即可。
如果您对程序集的默认命名空间不确定,可以在 Visual Studio 中打开资源文件的属性窗口,在其中查找 “命名空间” 属性,该属性的值就是您需要在字符串中使用的默认命名空间。
优化代码 string resourceName = "UpEXE.DLL.d3dcompiler_47.dll"; // 替换为你的命名空间和 DLL 文件名 using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { byte[] assemblyData = new byte[stream.Length]; stream.Read(assemblyData, 0, assemblyData.Length); return Assembly.Load(assemblyData); } resourceName = "UpEXE.DLL.ICSharpCode.SharpZipLib.dll"; // 替换为你的命名空间和 DLL 文件名 using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { byte[] assemblyData = new byte[stream.Length]; stream.Read(assemblyData, 0, assemblyData.Length); return Assembly.Load(assemblyData); }
为了优化代码,你可以将重复的代码块提取为一个方法,并根据需要进行调用。以下是优化后的代码示例:
```csharp
private Assembly LoadEmbeddedAssembly(string resourceName)
{
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
byte[] assemblyData = new byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
}
// 调用示例
Assembly assembly1 = LoadEmbeddedAssembly("UpEXE.DLL.d3dcompiler_47.dll");
Assembly assembly2 = LoadEmbeddedAssembly("UpEXE.DLL.ICSharpCode.SharpZipLib.dll");
```
通过将重复的代码块提取为一个方法,你可以避免重复编写相同的逻辑,并使代码更加简洁和易于维护。在需要加载其他嵌入的 DLL 文件时,只需调用 LoadEmbeddedAssembly 方法,并传递正确的资源名称即可。