我用C#编写的一个Windows窗体程序怎么样打包成一个安装包?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用C#编写的一个Windows窗体程序怎么样打包成一个安装包?相关的知识,希望对你有一定的参考价值。

我用C#编写的一个Windows窗体程序怎么样打包成一个安装包?并且用户可以选择按照路径。

照下面的一步步做,就可以做成安装程序包了
1 新建安装部署项目

打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定。

2 安装向导

关闭后打开安装向导,点击下一步,或者直接点击完成。

3 开始制作

安装向导完成后即可进入项目文件夹:

双击"应用程序文件夹"在右边的空白处右击,选择添加->文件,将你的做的应用程序的可执行文件和相应的类库和组件添加进来。然后右击你的文件,创建快捷方式,然后把快捷方式分别复制或剪切到左边的"用户的'程序'菜单"和"用户桌面"中。这样安装程序安装完成后会在 "开始->所有程序"和"桌面"上生成程序的快捷方式。也可以直接在"用户的'程序'菜单"和"用户桌面"相应目录下新建快捷方式,然后定位到你的文件。

然后右击左边的"应用程序文件夹"打开属性对话框:将属性中的"DefaultLocation"的路径中的"[Manufacturer]"去掉,不然的话做好的安装程序默认安装目录会是"C:\Program Files\你的用户名\安装解决方案名称";

然后打开解决方案管理器,右击你的解决方案名称,选择属性:打开的属性页中,选择"系统必备", 在打开的系统必备页中,在"指定系统必备安装组件的位置"中选中如下选择项:从与我的应用程序相同的位置下载系统必备组件。选上以后,在生成的安装文件包中包含.NetFramework组件 。好了,这样就完成99%了,然后点击"生成->生成解决方案",哈,生成成功!

4 制作完成

现在打开解决方案文件夹下的Debug文件夹,就可以看到生成的安装文件了。

5 关于"卸载"功能的添加

上面只介绍了简单的生成安装的方法,但是在VS2005下并没有直接生成卸载程序的功能,所以我们只好用msi来实现了,操作方法如下:

在添加你的应用程序项目的时候,多添加一个msiexec.exe进去,这个文件在c:\windows\system32文件夹下,添加进去以后,为了让他更像个卸载程序,把他的名字改成"Uninstall.exe",当然这个关系不大,改不改都行。

然后创建一个快捷方式,放到"开始-程序"中,接下来我们要做的就是查找这个部署项目的ProductCode了,鼠标左键单击项目名称,记住是左键单击,然后点击属性标签,注意:不是右击的属性,这个区别很大,这时你就可以看到ProductCode了。

然后打开你创建的那个快捷方式的属性对话框,在Aguements属性中输入"/x ProductCode",好了,然后点击"生成解决方案"即可生成带有卸载功能的安装程序了。
参考技术A NSIS!!!
这是最好的安装包制作工具.
参考技术B



参考技术C 解决方案中有发布方案,试一下,里面有不走的。ClickOnce

在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

【中文标题】在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL【英文标题】:Using a DirectX c++ DLL in a C# WPF or Windows Forms Application 【发布时间】:2019-02-19 13:44:04 【问题描述】:

我使用 c++ 编写了一个 DX11 渲染器。我现在正在寻找一种为其实现编辑器/GUI 的方法。

由于我非常习惯于 Windows 窗体和 WPF C# 应用程序,我正在考虑将我的渲染器放入 dll 中,从 c# 应用程序加载 dll 并使用它来绘制到表单的定义部分。这甚至可以与托管 c# 应用程序传递的窗口句柄一起使用吗?如果可以,性能如何?

据我了解,由于与 DX11 API 的实际通信仍将直接在 c++ 中进行,而 c# 部分只会告诉 dll 做什么,因此性能损失应该几乎没有。或者这通常是一个坏主意,使用库或 D2D 直接在 c++ 中实现 GUI 是更好的方法。

【问题讨论】:

您可能想查看 SharpDX 的代码以获得一些灵感。或者只是简单地使用 SharpDX,如果适合您的需要... ;-) 这正是我不想做的,SharpDX 是整个 API 的包装器,这意味着对 API 的每次调用都会产生额外的开销。没人用c#写游戏是有原因的。我只是在寻找一个 GUI 而不放弃直接使用 c++ 的好处。这是一个非常有趣的基准比较:code4k.blogspot.com/2011/03/… 啊,好吧,我误会你了。如果您的问题仅仅是关于您是否应该通过渲染器将 UI 渲染为 DX 表面的一部分,或者是否应该在 .NET 中构建 UI,而渲染器只是在该 UI 的面板/表面中渲染场景/模型,那么这纯粹是一种设计和实现选择,具体取决于您想要/需要的 UI 元素和渲染场景/模型之间的功能和交互。没有一个简单、普遍的答案,即一个好一个坏。这是您必须根据所需功能和涉及的开发做出的决定。费用。 【参考方案1】:

在 WPF 中,您可以使用 D3DImage,这就像 xaml 中的简单图像一样。一般原则如下:

分配 Direct3D 9 纹理,这将是您的渲染目标。 将其交给 D3DImage.SetBackBuffer。

将您的渲染代码放入 CompositionTarget.Rendering 事件处理程序。

    RenderStuffToTexture();
    d3dImage.Lock();
    d3dImage.AddDirtyRect(new Int32Rect()
    
        X = 0,
        Y = 0,
        Height = d3dImage.PixelHeight,
        Width = d3dImage.PixelWidth
    );
    d3dImage.Unlock();

由于您使用的是 Direct3D 11,因此您必须使用 DXGI surface sharing 与 D3D11 共享 D3D9 文本。我知道有两个例子说明了如何做到这一点。微软D3D11Image和D3DImageEx(我个人喜好,网上多处都可以找到)。

关于性能,一旦您使用 WPF,您就不再需要自己进行演示了。您实际上是在基于 WPF D3D9 的渲染器中编写了一个小的渲染到纹理逻辑。所以不是所有的事情都可以控制,包括演示时间。根据我的个人经验,您绝对可以以不错的帧速率渲染简单的场景。对于真正的图形密集型应用程序和严格的 FPS 要求,我会使用更轻量级(且侵入性更低)的 UI 解决方案。

请注意,您还可以使用 WinformHost 控件获取 HWND 并对其进行渲染。如果您想在渲染帧上覆盖 UI 控件,这有一个严重的缺点 - AFAIK 您根本做不到。

【讨论】:

以上是关于我用C#编写的一个Windows窗体程序怎么样打包成一个安装包?的主要内容,如果未能解决你的问题,请参考以下文章

我用C#创建的是windows窗体应用项目,做的是登陆页面,里面可以使用session吗

vs2015中的c#windows窗体应用程序怎么使用OpenGL?

求助: 用C#编写的winform窗体程序

用vs2010制作了c#windows窗体程序,但打包时在解决方案资源管理器窗口中找不到解决方案无

c#中让Windows窗体只运行一次,并在第二次启动窗体时激活该窗体

c# windows 窗体 如何 设置菜单的权限