【问题标题】:Create a .NET program that produces custom EXE's创建一个生成自定义 EXE 的 .NET 程序
【发布时间】:2012-03-29 14:27:48
【问题描述】:

我想创建一个生成可执行幻灯片的程序。

所以我需要它来输出一个包含一些必需代码和某些嵌入资源(图片)的 EXE。

.NET 是否提供这种能力?

【问题讨论】:

  • MSDN:System.Reflection.Emit
  • 你真的需要嵌入图片吗?如果没有,最好制作一个从文件夹加载图片并显示(全部)的程序,您只需将新图片放入文件夹中以创建新幻灯片,或为其他文件夹提供程序位置
  • 您为什么要这样做?为什么你不能只使用 powerpoint 和/或带有一些 command line options 的查看器??

标签: c# .net resources compilation exe


【解决方案1】:

您可以使用 CSharpCodeProvider 类在运行时编译代码并添加嵌入式资源。看看这篇我解释如何做的文章:SlideShow Builder

【讨论】:

    【解决方案2】:

    这很容易实现。

    您可以将图片添加为嵌入资源,然后使用反射技术来发现和检索嵌入的图片。

    所以你写的程序是独立于图片列表的,图片列表只是嵌入的资源。您可以使用 Visual Studio 将图片作为资源嵌入,或创建自定义程序来执行此操作。

    您可以在http://msdn.microsoft.com/en-us/library/aa287676(v=VS.71).aspxhttp://www.java2s.com/Code/CSharp/Development-Class/Saveandloadimagefromresourcefile.htm 找到一些示例。

    祝你好运!

    【讨论】:

      【解决方案3】:

      就像SK-Logic所说的那样

      http://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx

      这是一个例子

      http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html

      如果您需要帮助,您也可以创建项目文件并创建代码文件并使用 Process 类调用编译器,我可以举个例子

      【讨论】:

        【解决方案4】:

        这将为您生成一个具有指定名称的进程(您仍需要为图片添加代码):

            public static Process GenerateRuntimeProcess(string processName, int aliveDuration, bool throwOnException = true)
            {
                Process result = null;
                try
                {
                    AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName() { Name = processName }, AssemblyBuilderAccess.Save);
                    ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(processName, processName + ".EXE");
                    TypeBuilder typeBuilder = moduleBuilder.DefineType("Program", TypeAttributes.Public);
                    MethodBuilder methodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static, null, null);
                    ILGenerator il = methodBuilder.GetILGenerator();
                    il.UsingNamespace("System.Threading");
                    il.EmitWriteLine("Hello World");
                    il.Emit(OpCodes.Ldc_I4, aliveDuration);
                    il.Emit(OpCodes.Call, typeof(Thread).GetMethod("Sleep", new Type[] { typeof(int) }));
                    il.Emit(OpCodes.Ret);
                    typeBuilder.CreateType();
                    assemblyBuilder.SetEntryPoint(methodBuilder.GetBaseDefinition(), PEFileKinds.ConsoleApplication);
                    assemblyBuilder.Save(processName + ".EXE", PortableExecutableKinds.Required32Bit, ImageFileMachine.I386);
                    result = Process.Start(new ProcessStartInfo(processName + ".EXE")
                    {
                        WindowStyle = ProcessWindowStyle.Hidden
                    });
                }
                catch
                {
                    if (throwOnException)
                    {
                        throw;
                    }
                    result = null;
                }
                return result;
            }
        

        您可以在 MSDN here 或教程 herehere 上找到有关 System.Reflection.Emit 的更多信息。

        如果我是你,我也会考虑使用 powerpoint 和/或查看器应用程序以及一些命令行选项,详细信息 here。也许您根本不需要“制作一个制作另一个幻灯片应用的应用”..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多