如何把Winform项目资源文件打包成一个exe(非安装包)

ljldashen 2019-01-09 09:42:48
我在项目里引入了一个txt或者可以说是bat文件,并读取了文件里的内容,怎么才可以将所有引入的资源文件打包成一个(独立文件)点击这个打包后的文件即可运行程序?
因为项目内部会引用多个资源文件,如果不打包,要保证项目正常运行必须保证所有的文件存放位置与引用路径一致。资源文件数量过多的话会非常麻烦。所以我想将资源文件进行合并。
网上都说可以通过costura.fody插件进行资源文件合并,可是我使用以后完全没有效果,不知道为何,有人使用过该插件吗?使用过程是如何?
以下是我构建的一个测试程序


问题关键是如何处理资源文件或其路径
...全文
1346 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lindexi_gd 2019-01-31
  • 打赏
  • 举报
回复
大概 Fody 的方法
游北亮 2019-01-31
  • 打赏
  • 举报
回复
刚好前段时间封装了一个读取内嵌dll资源的方法,把引用的dll都嵌入到exe里,读取txt之类的方法也是类似的:


#region 从exe嵌入资源里加载dll的方法, Web项目不要使用

private static Assembly exeAss = Assembly.GetEntryAssembly();
private static System.Resources.ResourceManager resManager;
private static System.Resources.ResourceManager ResManager
{
    get
    {
        if (resManager == null)
        {
            var entryNamespace = exeAss.GetTypes()[0].Namespace;
            resManager = new System.Resources.ResourceManager(entryNamespace + ".Properties.Resources",
                Assembly.GetExecutingAssembly());
        }
        return resManager;
    }
}

/// <summary>
/// 从嵌入的资源文件里加载dll,调用方法:在Main函数里执行:
/// AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
/// <returns></returns>
public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    // System.Reflection.RuntimeAssembly exeAss;  exeAss.GetManifestResourceNames()
    var idx = args.Name.IndexOf(',');
    string dllName = idx > 0 ? args.Name.Substring(0, idx) : args.Name.Replace(".dll", "");
    if (dllName.EndsWith(".resources"))
    {
        return null;
    }

    // 读取那些 生成操作为“嵌入的资源”的数据
    string resourceName = $"{exeAss.GetTypes()[0].Namespace}.{dllName}.dll";
    using (var stream = exeAss.GetManifestResourceStream(resourceName))
    {
        if (stream != null)
        {
            var len = (int)stream.Length;
            var assemblyData = new byte[len];
            if (stream.Read(assemblyData, 0, len) == len)
            {
                return Assembly.Load(assemblyData);
            }
        }
    }

    // 读取那些 嵌入在“Resources.resx”里的数据
    dllName = dllName.Replace(".", "_");
    try
    {
        var bytes = (byte[])ResManager.GetObject(dllName);
        if (bytes == null)
        {
            return null;
        }
        return Assembly.Load(bytes);
    }
    catch (Exception)
    {
        return null;
    }
}

#endregion

  • 打赏
  • 举报
回复
在Vs中右键然后选择生成操作作为“嵌入的资源”,但读取方式就要做调整了

1,978

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧