ChatGPT解决这个技术问题 Extra ChatGPT

如何读取嵌入式资源文本文件

如何使用 StreamReader 读取嵌入式资源(文本文件)并将其作为字符串返回?我当前的脚本使用 Windows 表单和文本框,允许用户在未嵌入的文本文件中查找和替换文本。

private void button1_Click(object sender, EventArgs e)
{
    StringCollection strValuesToSearch = new StringCollection();
    strValuesToSearch.Add("Apple");
    string stringToReplace;
    stringToReplace = textBox1.Text;

    StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
    string FileContents;
    FileContents = FileReader.ReadToEnd();
    FileReader.Close();
    foreach (string s in strValuesToSearch)
    {
        if (FileContents.Contains(s))
            FileContents = FileContents.Replace(s, stringToReplace);
    }
    StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
    FileWriter.Write(FileContents);
    FileWriter.Close();
}

W
Wai Ha Lee

您可以使用 Assembly.GetManifestResourceStream Method

使用 System.IO 添加以下用法;使用 System.Reflection;设置相关文件的属性:带有值 Embedded Resource 的参数 Build Action 使用以下代码 var assembly = Assembly.GetExecutingAssembly(); var resourceName = "MyCompany.MyProduct.MyFile.txt";使用 (Stream stream = assembly.GetManifestResourceStream(resourceName)) 使用 (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); } resourceName 是嵌入在程序集中的资源之一的名称。例如,如果您嵌入了一个名为“MyFile.txt”的文本文件,该文件位于具有默认命名空间“MyCompany.MyProduct”的项目的根目录中,则 resourceName 为“MyCompany.MyProduct.MyFile.txt”。您可以使用 Assembly.GetManifestResourceNames 方法获取程序集中所有资源的列表。

仅从文件名中获取 resourceName 的明智之举(通过命名空间的东西):

string resourceName = assembly.GetManifestResourceNames()
  .Single(str => str.EndsWith("YourFileName.txt"));

一个完整的例子:

public string ReadResource(string name)
{
    // Determine path
    var assembly = Assembly.GetExecutingAssembly();
    string resourcePath = name;
    // Format: "{Namespace}.{Folder}.{filename}.{Extension}"
    if (!name.StartsWith(nameof(SignificantDrawerCompiler)))
    {
        resourcePath = assembly.GetManifestResourceNames()
            .Single(str => str.EndsWith(name));
    }

    using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
    using (StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

GetManifestResourceStream 的参数需要@adrian 指示的路径。如果它对任何人都有帮助,那么该路径就像 @SimpleCoder 在示例中显示的那样:MyNamespace.Filename.Ext。我之前尝试过 MyNamespace.Resources.Filename.Ext,但结果为空。
如果您的资源不是直接在项目根目录中,而是在某个子文件夹中,请不要忘记将此文件夹名称也放在资源名称中(例如“MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention”)
值得一提的是,资源“Build Action”必须设置为“Embedded Resource”
呃... SignificantDrawerCompiler
还对显着DrawerCompiler 是什么感到困惑?
S
StayOnTarget

您可以使用两种不同的方法将文件添加为资源。

访问文件所需的 C# 代码会有所不同,具体取决于最初用于添加文件的方法。

方法一:添加已有文件,设置属性为 Embedded Resource

将文件添加到您的项目中,然后将类型设置为 Embedded Resource

注意:如果您使用此方法添加文件,则可以使用 GetManifestResourceStream 访问它(请参阅 answer from @dtb)。

https://i.stack.imgur.com/qimwi.png

方法2:将文件添加到Resources.resx

打开 Resources.resx 文件,使用下拉框添加文件,将 Access Modifier 设置为 public

注意:如果您使用此方法添加文件,则可以使用 Properties.Resources 访问它(请参阅 answer from @Night Walker)。

https://i.stack.imgur.com/m56aJ.png


第三种方法是将文件添加到项目中,然后将“复制到输出目录”设置为“真”。编译时,文件被复制到输出目录中,您可以使用正常方式读取文件。示例:当您想要显示图像时,在 WPF 应用程序中。
因此将构建操作设置为 Resource 不会让您将项目作为资源读出?您必须使用 EmbeddedResource 还是添加到 Resources.resx 文件?
@Maslow 将构建操作设置为“资源”会创建一个链接资源,而将构建操作设置为“嵌入式资源”会将资源编译到输出程序集中。术语“链接资源”是“在编译时将文件复制到输出目录”的花哨术语(然后您可以在运行时使用任何常规方法读取文件)。有关这两种类型之间区别的更多信息,请参阅 msdn.microsoft.com/en-us/library/7k989cfy(v=vs.90).aspx 处的添加和编辑资源 (Visual C#)。
如果您想以这种方式动态地使用资源,请不要这样:Properties.Resources.Your_resource_name 写成:Properties.Resources.ResourceManager.GetObject("Your_resource_name")
这个答案实际上帮助我弄清楚了我仍然缺少什么:在文件中设置“构建操作:嵌入式资源”。我想知道为什么他们没有出现。现在我想知道为什么这不是默认设置。您是否有任何理由将文件添加为资源而不嵌入它?
S
Steve

基本上,您使用 System.Reflection 来获取对当前程序集的引用。然后,您使用 GetManifestResourceStream()

例如,从我发布的页面:

注意:需要添加 using System.Reflection; 才能使用

   Assembly _assembly;
   StreamReader _textStreamReader;

   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }

+1 将 namespace 作为资源名称的一部分
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); 当您想了解确切的资源名称时,此方法可能非常有用。 (取自问题 stackoverflow.com/questions/27757/…
C
Community

https://i.stack.imgur.com/Q5rXc.png

然后可以通过以下方式将生成的文件作为字节数组访问

byte[] jsonSecrets = GoogleAnalyticsExtractor.Properties.Resources.client_secrets_reporter;

如果您需要它作为流,那么(来自 https://stackoverflow.com/a/4736185/432976

Stream stream = new MemoryStream(jsonSecrets)

您也可以将其与文本文件一起使用,在这种情况下,您将拥有: string jsonSecrets = YourNameSpace.Properties.Resources.YourFileName;
A
Ami Tavory

当您将文件添加到资源中时,您应该选择它的访问修饰符作为公共而不是您可以进行如下操作。

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 是嵌入文件的名称。

其实你可以去resources.Designer.cs看看getter的名字是什么。


你能解释一下吗?当我在解决方案资源管理器中右键单击文件 -> 属性,然后将 Action 设置为 Incorporated ressource 时,属性面板中没有任何 Access Modifiers 字段。另外,我没有 Propersites.Resources 类,编译代码时出现 The name 'Properties' does not exist in the current context 错误。
这仅在您将文件嵌入 Resources.resx 时才有效,请参阅我对将文件嵌入项目的不同方法的回答。
属性在哪里定义?
m
miciry89

添加例如 Testfile.sql 项目菜单 -> 属性 -> 资源 -> 添加现有文件

    string queryFromResourceFile = Properties.Resources.Testfile.ToString();

https://i.stack.imgur.com/FFklR.png


它将返回 byte[] ,对于文本文件使用 `Encoding.UTF8.GetString(Properties.Resources.Testfile)`
A
Amber

我知道这是一个旧线程,但这对我有用:

将文本文件添加到项目资源中,将访问修饰符设置为公共,如 Andrew Hill 所示,阅读文本如下: textBox1 = new TextBox(); textBox1.Text = Properties.Resources.SomeText;

我添加到资源中的文本:'SomeText.txt'


P
Peter Gfader

我刚才学到的是,你的文件不允许有“.”。 (点)在文件名中。

https://i.stack.imgur.com/NuoOi.jpg

Templates.plainEmailBodyTemplate-en.txt --> 有效!!! Templates.plainEmailBodyTemplate.en.txt --> 不能通过 GetManifestResourceStream() 工作

可能是因为框架对命名空间和文件名感到困惑......


对不起。这是错误的。点工作。 (至少它对我有用,NET4.5)我不知道你为什么有这个错误。
是的,它们可以工作,但它们充当目录分隔符。 Templates.plainEmailBodyTemplate.en.txt 将寻找“\Templates\plainEmailBodyTemplate\en.txt”资源
不,我试过了。 GetManifestResourceStream 可以访问文件名中包含多个点的嵌入式资源。 (NET4.5)
我在 .NET 4.5 中遇到了同样的问题。名称中带有点的文件甚至没有添加到资源集合中。方法 assembly.GetManifestResourceNames() 向我返回空列表。后来我发现问题仅出在语言代码上。 ca.abcd.sk.crt 未添加到资源中,而 ca.abcd.crt 添加没有问题。
在 2020 年仍然正确。非常感谢,我对此感到抓狂。
T
Timmerz

您还可以使用@dtb 答案的简化版本:

public string GetEmbeddedResource(string ns, string res)
{
    using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("{0}.{1}", ns, res))))
    {
        return reader.ReadToEnd();
    }
}

您确定吗?根据这个这个链接,我看起来像....stackoverflow.com/questions/1065168/…
t
t3chb0t

结合你的所有力量,我使用这个帮助程序类以通用方式从任何程序集和任何命名空间读取资源。

public class ResourceReader
{
    public static IEnumerable<string> FindEmbededResources<TAssembly>(Func<string, bool> predicate)
    {
        if (predicate == null) throw new ArgumentNullException(nameof(predicate));

        return
            GetEmbededResourceNames<TAssembly>()
                .Where(predicate)
                .Select(name => ReadEmbededResource(typeof(TAssembly), name))
                .Where(x => !string.IsNullOrEmpty(x));
    }

    public static IEnumerable<string> GetEmbededResourceNames<TAssembly>()
    {
        var assembly = Assembly.GetAssembly(typeof(TAssembly));
        return assembly.GetManifestResourceNames();
    }

    public static string ReadEmbededResource<TAssembly, TNamespace>(string name)
    {
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
        return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name);
    }

    public static string ReadEmbededResource(Type assemblyType, Type namespaceType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType));
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

        return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}");
    }

    public static string ReadEmbededResource(Type assemblyType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

        var assembly = Assembly.GetAssembly(assemblyType);
        using (var resourceStream = assembly.GetManifestResourceStream(name))
        {
            if (resourceStream == null) return null;
            using (var streamReader = new StreamReader(resourceStream))
            {
                return streamReader.ReadToEnd();
            }
        }
    }
}

加一个船长星球:P
a
ann

我知道这是旧的,但我只想指出 NETMF(.Net MicroFramework),你可以轻松地做到这一点:

string response = Resources.GetString(Resources.StringResources.MyFileName);

由于 NETMF 没有 GetManifestResourceStream


P
Philippe

我读了一个嵌入式资源文本文件使用:

    /// <summary>
    /// Converts to generic list a byte array
    /// </summary>
    /// <param name="content">byte array (embedded resource)</param>
    /// <returns>generic list of strings</returns>
    private List<string> GetLines(byte[] content)
    {
        string s = Encoding.Default.GetString(content, 0, content.Length - 1);
        return new List<string>(s.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
    }

样本:

var template = GetLines(Properties.Resources.LasTemplate /* resource name */);

template.ForEach(ln =>
{
    Debug.WriteLine(ln);
});

D
Dietrich Baumgarten

某些 VS .NET 项目类型不会自动生成 .NET (.resx) 文件。以下步骤将资源文件添加到您的项目中:

右键单击项目节点并选择 Add/New Item,滚动到 Resources File。在名称框中选择适当的名称,例如资源,然后单击添加按钮。资源文件 Resources.resx 被添加到项目中,并且可以被视为解决方案资源管理器中的一个节点。实际上,创建了两个文件,还有一个自动生成的 C# 类 Resources.Designer.cs。不要编辑它,它由 VS 维护。该文件包含一个名为 Resources 的类。

现在您可以将文本文件添加为资源,例如 xml 文件:

双击 Resources.resx。选择添加资源 > 添加现有文件并滚动到要包含的文件。为访问修改保留默认值内部。一个图标代表新的资源项。如果选中,属性窗格将显示其属性。对于 xml 文件,在属性 Encoding 下选择 Unicode (UTF-8) – Codepage 65001 而不是默认的本地代码页。对于其他文本文件,请选择此文件的正确编码,例如代码页 1252。对于像 xml 文件这样的文本文件,资源类有一个字符串类型的属性,该属性以包含的文件命名。如果文件名是例如 RibbonManifest.xml,那么属性应该具有名称 RibbonManifest。您可以在代码文件 Resources.Designer.cs 中找到确切的名称。像使用任何其他字符串属性一样使用字符串属性,例如:string xml = Resources.RibbonManifest。一般形式是 ResourceFileName.IncludedTextFileName。不要使用 ResourceManager.GetString,因为字符串属性的 get-function 已经这样做了。


谢谢!这是唯一对我有用的答案,它有我能理解的易懂的步骤。我的应用程序没有资源文件,我必须创建一个。对我来说,唯一的事情是在第 1 步没有添加按钮,我不得不点击保存。
B
BullyWiiPlaza

这是一个您可能会发现非常方便从当前 Assembly 读取嵌入资源文件的类:

using System.IO;
using System.Linq;
using System.Text;
using System.Reflection;

public static class EmbeddedResourceUtils
{
    public static string ReadFromResourceFile(string endingFileName)
    {
        var assembly = Assembly.GetExecutingAssembly();
        var manifestResourceNames = assembly.GetManifestResourceNames();

        foreach (var resourceName in manifestResourceNames)
        {
            var fileNameFromResourceName = _GetFileNameFromResourceName(resourceName);
            if (!fileNameFromResourceName.EndsWith(endingFileName))
            {
                continue;
            }

            using (var manifestResourceStream = assembly.GetManifestResourceStream(resourceName))
            {
                if (manifestResourceStream == null)
                {
                    continue;
                }

                using (var streamReader = new StreamReader(manifestResourceStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }

        return null;
    }
    
    // https://stackoverflow.com/a/32176198/3764804
    private static string _GetFileNameFromResourceName(string resourceName)
    {
        var stringBuilder = new StringBuilder();
        var escapeDot = false;
        var haveExtension = false;

        for (var resourceNameIndex = resourceName.Length - 1;
            resourceNameIndex >= 0;
            resourceNameIndex--)
        {
            if (resourceName[resourceNameIndex] == '_')
            {
                escapeDot = true;
                continue;
            }

            if (resourceName[resourceNameIndex] == '.')
            {
                if (!escapeDot)
                {
                    if (haveExtension)
                    {
                        stringBuilder.Append('\\');
                        continue;
                    }

                    haveExtension = true;
                }
            }
            else
            {
                escapeDot = false;
            }

            stringBuilder.Append(resourceName[resourceNameIndex]);
        }

        var fileName = Path.GetDirectoryName(stringBuilder.ToString());
        return fileName == null ? null : new string(fileName.Reverse().ToArray());
    }
}

@Krythic:很明显,如果您将整个类复制到源代码中。然后,您的 IDE 将自动解决所有问题。我已经包含了 using 语句,因此答案中没有丢失信息。
@Krythic:现在编辑它以删除静态使用
非常感谢这只是一个礼貌的通知,它缺少 using System.Reflection;:D
B
Bimo

阅读此处发布的所有解决方案后。这就是我解决它的方法:

// How to embedded a "Text file" inside of a C# project
//   and read it as a resource from c# code:
//
// (1) Add Text File to Project.  example: 'myfile.txt'
//
// (2) Change Text File Properties:
//      Build-action: EmbeddedResource
//      Logical-name: myfile.txt      
//          (note only 1 dot permitted in filename)
//
// (3) from c# get the string for the entire embedded file as follows:
//
//     string myfile = GetEmbeddedResourceFile("myfile.txt");

public static string GetEmbeddedResourceFile(string filename) {
    var a = System.Reflection.Assembly.GetExecutingAssembly();
    using (var s = a.GetManifestResourceStream(filename))
    using (var r = new System.IO.StreamReader(s))
    {
        string result = r.ReadToEnd();
        return result;
    }
    return "";      
}

J
Jamisco

答案很简单,如果您直接从 resources.resx 添加文件,只需执行此操作即可。

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

使用那行代码,文件中的文本直接从文件中读取并放入字符串变量中。


这将返回字节数组而不是字符串
@Elnoor我不相信这是真的,或者至少不是所有版本都是真的。 .NetCore/Framework 的。我用 .Net 4.0 对此进行了测试,fileNameSpace.Properties.Resources.fileName; 是字符串类型。
我已经在Core中进行了测试。也许在网络标准中是的会返回字符串
S
Saeb Amini

我想以字节数组的形式读取嵌入式资源(不假设任何特定编码),最后我使用了 MemoryStream,这使得它非常简单:

using var resStream = assembly.GetManifestResourceStream(GetType(), "file.txt");
var ms = new MemoryStream();
await resStream .CopyToAsync(ms);
var bytes = ms.ToArray();

b
bytedev
public class AssemblyTextFileReader
{
    private readonly Assembly _assembly;

    public AssemblyTextFileReader(Assembly assembly)
    {
        _assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
    }

    public async Task<string> ReadFileAsync(string fileName)
    {
        var resourceName = _assembly.GetManifestResourceName(fileName);

        using (var stream = _assembly.GetManifestResourceStream(resourceName))
        {
            using (var reader = new StreamReader(stream))
            {
                return await reader.ReadToEndAsync();
            }
        }
    }
}

public static class AssemblyExtensions
{
    public static string GetManifestResourceName(this Assembly assembly, string fileName)
    {
        string name = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.InvariantCultureIgnoreCase));

        if (string.IsNullOrEmpty(name))
        {
            throw new FileNotFoundException($"Embedded file '{fileName}' could not be found in assembly '{assembly.FullName}'.", fileName);
        }

        return name;
    }
}
// To use the code above:
var reader = new AssemblyTextFileReader(assembly);

string text = await reader.ReadFileAsync(@"MyFile.txt");

F
Felix Keil

我很生气您必须始终在字符串中包含名称空间和文件夹。我想简化对嵌入式资源的访问。这就是我写这个小班的原因。随意使用和改进!

用法:

using(Stream stream = EmbeddedResources.ExecutingResources.GetStream("filename.txt"))
{
 //...
}

班级:

public class EmbeddedResources
{
    private static readonly Lazy<EmbeddedResources> _callingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetCallingAssembly()));

    private static readonly Lazy<EmbeddedResources> _entryResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetEntryAssembly()));

    private static readonly Lazy<EmbeddedResources> _executingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetExecutingAssembly()));

    private readonly Assembly _assembly;

    private readonly string[] _resources;

    public EmbeddedResources(Assembly assembly)
    {
        _assembly = assembly;
        _resources = assembly.GetManifestResourceNames();
    }

    public static EmbeddedResources CallingResources => _callingResources.Value;

    public static EmbeddedResources EntryResources => _entryResources.Value;

    public static EmbeddedResources ExecutingResources => _executingResources.Value;

    public Stream GetStream(string resName) => _assembly.GetManifestResourceStream(_resources.Single(s => s.Contains(resName)));

}

那么超级简单的解决方案呢: var resName = assembly.GetManifestResourceNames().Where(i => i.EndsWith(fileName)).FirstOrDefault();如果将整个目录放入程序集中,它将不起作用,否则它只是一行;)
@Harry 确定你可以做到这一点。这与我的答案有什么关系?您想改进 GetStream 方法吗?那么你如何处理歧义呢?
@Estevez 使用系统;使用 System.IO;使用 System.Linq;使用 System.Reflection;
由于某种原因,当放置在另一个项目中时,类不起作用。调用和执行程序集都是指具有此类的程序集,而不是实际执行测试的程序集。没有静态和延迟初始化一切都很好。
@CurlyBrace 谢谢。延迟评估是这个答案中的一个真正缺陷,因为调用和执行程序集会根据上下文而变化。每次访问都需要解决它们。
M
Matteo Gariglio

正如 SonarCloud 所指出的,最好做:

public class Example
{
    public static void Main()
    { 
        // Compliant: type of the current class
        Assembly assembly = typeof(Example).Assembly; 
        Console.WriteLine("Assembly name: {0}", assem.FullName);

        // Non-compliant
        Assembly assembly = Assembly.GetExecutingAssembly();
        Console.WriteLine("Assembly name: {0}", assem.FullName);
    }
}

S
Swat

对于所有快速想要winforms中硬编码文件文本的人;

在解决方案资源管理器中右键单击您的应用程序 > 资源 > 添加您的文件。单击它,然后在属性选项卡中将“文件类型”设置为“文本”。在你的程序中只做 Resources..toString();读取文件。

我不建议将此作为最佳实践或任何东西,但它可以快速运行并完成它需要做的事情。


M
MasterCassidy

在表单加载事件中读取嵌入式 TXT 文件。

动态设置变量。

string f1 = "AppName.File1.Ext";
string f2 = "AppName.File2.Ext";
string f3 = "AppName.File3.Ext";

调用 Try Catch。

try 
{
     IncludeText(f1,f2,f3); 
     /// Pass the Resources Dynamically 
     /// through the call stack.
}

catch (Exception Ex)
{
     MessageBox.Show(Ex.Message);  
     /// Error for if the Stream is Null.
}

为 IncludeText() 创建 Void,Visual Studio 会为您执行此操作。单击灯泡以自动生成代码块。

将以下内容放入生成的代码块中

资源 1

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file1))
using (StreamReader reader = new StreamReader(stream))
{
string result1 = reader.ReadToEnd();
richTextBox1.AppendText(result1 + Environment.NewLine + Environment.NewLine );
}

资源 2

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file2))
using (StreamReader reader = new StreamReader(stream))
{
string result2 = reader.ReadToEnd();
richTextBox1.AppendText(
result2 + Environment.NewLine + 
Environment.NewLine );
}

资源 3

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file3))

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    richTextBox1.AppendText(result3);
}

如果您希望将返回的变量发送到其他地方,只需调用另一个函数并...

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    ///richTextBox1.AppendText(result3);
    string extVar = result3;

    /// another try catch here.

   try {

   SendVariableToLocation(extVar)
   {
         //// Put Code Here.
   }

       }

  catch (Exception ex)
  {
    Messagebox.Show(ex.Message);
  }

}

这样做的结果是,一种在单个富文本框中组合多个 txt 文件并读取其嵌入数据的方法。这是我对这个代码示例想要的效果。


s
schlebe

对于使用 VB.Net 的用户

Imports System.IO
Imports System.Reflection

Dim reader As StreamReader
Dim ass As Assembly = Assembly.GetExecutingAssembly()
Dim sFileName = "MyApplicationName.JavaScript.js" 
Dim reader = New StreamReader(ass.GetManifestResourceStream(sFileName))
Dim sScriptText = reader.ReadToEnd()
reader.Close()

其中 MyApplicationName 是我的应用程序的命名空间。它不是程序集名称。此名称在项目的属性(应用程序选项卡)中定义。

如果找不到正确的资源名称,可以使用 GetManifestResourceNames() 函数

Dim resourceName() As String = ass.GetManifestResourceNames()

或者

Dim sName As String 
    = ass.GetManifestResourceNames()
        .Single(Function(x) x.EndsWith("JavaScript.js"))

或者

Dim sNameList 
    = ass.GetManifestResourceNames()
        .Where(Function(x As String) x.EndsWith(".js"))

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅