这是非常基本的东西,但是这里有.我发现我无法同意自己,将大型课程分成小型课程的方式是否使得课程更易于维护或更难以维护.我熟悉设计模式,虽然不是很详细,但也熟悉面向对象设计的概念.抛开所有花哨的规则和指导方针,我希望通过一个非常简单的示例场景来挑选我所缺少的内容.基本上是这样的:"......这种设计会让它变得更加困难"......等等......由于缺乏经验,所以我没有预料到的所有事情.
假设您需要编写基本的"文件读取器/文件编写器"样式类来处理某种类型的文件.我们将该文件称为YadaKungFoo文件.YadaKungFoo文件的内容基本上类似于INI文件,但有细微差别.
有部分和价值观:
[Sections]
Kung,Foo
Panda, Kongo
[AnotherSection]
Yada,Yada,Yada
Subtle,Difference,Here,Yes
[Dependencies]
PreProcess,SomeStuffToPreDo
PreProcess,MoreStuff
PostProcess,AfterEight
PostProcess,TheEndIsNear
PostProcess,TheEnd
Run Code Online (Sandbox Code Playgroud)
好的,所以这可以产生3个基本类:
public class YadaKungFooFile
public class YadaKungFooFileSection
public class YadaKungFooFileSectionValue
Run Code Online (Sandbox Code Playgroud)
后两个类本质上只是具有ToString()重写的数据结构,以吐出使用几个通用列表存储的值的字符串列表.这足以实现YadaKungFooFile保存功能.
所以随着时间的推移,YadaYadaFile开始增长.几种重载以不同的格式保存,包括XML等,文件开始推向800行左右.现在真正的问题是:我们想要添加一个功能来验证YadaKungFoo文件的内容.想到的第一件事显然是添加:
var yada = new YadaKungFooFile("C:\Path");
var res = yada .Validate()
Run Code Online (Sandbox Code Playgroud)
我们已经完成了(我们甚至可以从构造函数中调用该方法).麻烦的是验证非常复杂,并且使得类非常大,所以我们决定创建一个这样的新类:
var yada = new YadaKungFooFile("C:\Path");
var validator = new YadaKungFooFileValidator(yada);
var result = validator.Validate();
Run Code Online (Sandbox Code Playgroud)
现在这个样本显然非常简单,琐碎且微不足道.上述两种方式中的任何一种都可能不会产生太大的差异,但我不喜欢的是:
总而言之,我想我觉得我没有经验可以理解设计为什么不好的所有方面,在什么情况下它并不重要,哪些关注更重要:更小的类或更具凝聚力的类.他们似乎是矛盾的要求,但也许我错了.也许验证器类应该是一个复合对象?
基本上我要求就上述设计可能带来的好处/问题提出意见.有什么不同的做法?(基础FileValidator类,FileValidator接口等等.你的名字).想想YadaKungFooFile功能随着时间的推移不断增长.
以下目录设置对我来说非常适合.
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id="ProgramFilesFolder">
<Directory Id='INSTALLDIR' Name='MyApp'/>
</Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将"ProgramFilesFolder"更改为" LocalAppDataFolder "时,在使用light链接和生成我的msi 时遇到了很多错误:
D:\runGroup.wxs(53) : error LGHT0204: ICE38: Component cmpA5561BE36D80EB58252E69DDA0C2FF8C installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file.
D:\main.wxs(38) : error LGHT0204 : ICE64: The directory INSTALLDIR is in the user profile but is not listed in the Remove File table.
看起来"LocalAppDataFolder"对于WiX来说是不可接受的,而我相信它是这里定义的系统文件夹属性之一.
我应该为LocalAppData文件夹使用什么?
我的C#应用程序有一个wix Windows Installer.事情正在发挥作用,我能够安装和卸载应用程序.但是我想要在我的应用程序中安装一些先决条件和其他第三方应用程序.
先决条件:
第三方申请:
当然,我并不是在寻找所有先决条件和第三方应用程序的完整指南.我只需要大家帮忙搞清楚我是如何将这些exe和msi设置嵌入到我的wix安装中的一部分.
此外,有些是为了x64,有些是为了x86,所以它应该足以处理操作系统版本和架构.如何用wix实现这一目标.
我一直在互联网上搜索一段时间,似乎没有什么具体的东西适合我.
我需要确保如果没有安装这些应用程序,那么软件也应该不安装.除此之外,如果已安装任何先决条件或第三方应用程序,则不应再次安装.
我想这可以使用一些wix工具完成,但我无法获得有关howto的任何具体说明.
编辑1
好的我已经Microsoft .NET Framework 4 (x86 and x64)安装了,我现在面临的问题是我无法安装SQL Server Compact 3.5 SP2.我正在逐一做事让我更清楚.在这里,我正在分享我的代码,以便人们可以查看:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="Bootstrapper" Version="1.0.0.0" Manufacturer="Billy"
UpgradeCode="PUT-GUID-HERE">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<PackageGroupRef Id="Netfx4Full"/>
<PackageGroupRef Id="SQLExpressCE"/>
<!-- Install Application …Run Code Online (Sandbox Code Playgroud) 如果用户在电池电量低于5%时尝试安装我的应用程序,是否有任何方法可以显示警告消息?我正在使用InstallShield.
我需要处理一个文件夹中的一些dll和exe文件,并确定我正在处理的文件类型:.NET,COM,Win32或其他一些外来生命形式.
我一直在尝试确定检测DLL类型的最简单方法,你怎么看待这个:
COM dll =>我做了一个LoadLibrary,然后是" DllRegisterServer "的GetProcAddress .如果我得到有效的回报,那就是一个COM文件.
.NET dll =>如果dll依赖于MSCOREE.DLL,它总是一个.NET dll?
Win32 dll =>如果上述测试都失败了,那就是Win32 dll?
当然必须有更好的方法来检测我们正在处理的dll类型.以上是非常笨重的,并不适用于EXE文件?必须有一些我没想到的其他方式.
理想情况下,我希望能够让解析器确定编译文件的编译器,以及它使用的功能,如MFC,Atl,Stl等......但我怀疑在预反射时代是否可行?
我正在寻找Install Shield的替代安装应用程序的建议.
我们目前正在使用Install Shield,我从未对它印象深刻.它太笨重了,脚本系统很糟糕.
有没有人比其他任何产品好运,如WiX,Inno Setup,NSIS或InstallAware等?我并不担心成本,但我正在寻找的是一个非常轻量级,易于使用的应用程序捆绑我们的.exe和大约20个支持DLL,注册一些,设置一些注册表值和安装帮助.
谁能推荐他们正在使用的东西?很高兴听到那些已经从Install Shield转换过来的人,是什么让你使用的新应用程序变得更好.
installer windows-installer installshield wix advanced-installer
我想要静默安装MSI文件.
/ qn和/ quiet作为msiexec.exe的参数有什么区别?
如何避免WiX/MSI部署解决方案中的常见设计缺陷?
部署是大多数开发的关键部分 - 部署失败意味着您的最终用户永远无法评估您的产品.这很容易成为软件开发中最昂贵的错误.请给这个内容一个机会.我坚信,通过应用程序设计的微小变化可以显着提高软件质量,使部署更加合理,更可靠 - 这就是"答案"的全部 - 软件开发.
这是一个Q/A风格的问题,答案只列出了MSI文件中不要做的一些事情,以避免最常见的设计缺陷.
windows-installer installshield wix advanced-installer installshield-le
我想从我的C#.NET应用程序以编程方式安装一个给定的.msi包,最好是我的应用程序指定的安装参数(如安装路径,拒绝crapware等).
我做了一些搜索,但我还没有找到任何有用的东西.最有希望的命中了这个话题,但我找不到任何文档Microsoft.Deployment.WindowsInstaller或WindowsInstaller.Installer与此有关.
我正在使用WiX在测试机器上安装服务.但是当我这样做时,只有在机器上安装它的用户才能在"添加/删除程序"控制面板选项中看到.但是我想让它对机器上的每个用户都可见.
我做了一些研究,并意识到我AllUSERS在.wxs文件中创建安装程序时没有设置属性.
所以我用这行更新了我的脚本<Property Id="AllUSERS" Value="1"/>并创建了安装程序.但仍然只有安装的用户可以在控制面板中看到它.
这是我创建安装程序的脚本.
<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
<Product Name='Importer Service' Id='PUT-GUID-HERE' UpgradeCode='PUT-GUID-HERE'
Language='1033' Codepage='1252' Version='$(var.version)' Manufacturer='Test'>
<Package Id='*' Keywords='Installer' Description="Imports data"
Manufacturer='Test' InstallerVersion='100' Languages='1033' Compressed='yes'
SummaryCodepage='1252' />
<Media Id='1' Cabinet='ImporterWebService.cab' EmbedCab='yes'
DiskPrompt="CD-ROM #1" />
<Property Id='DiskPrompt' Value="Importer Web Service 1.0 Installation [1]" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
<Property Id="AllUSERS" Value="1"/>
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<Directory Id='Test' Name='Test1'>
<Directory Id='INSTALLDIR' Name='Importer Service'>
<Component Id='MainExecutable' Guid='*'>
<File Id='ImporterWindowsServiceEXE'
Name='Importer.WindowsService.exe' DiskId='1'
Source='Importer.WindowsService.exe' KeyPath='yes'> …Run Code Online (Sandbox Code Playgroud)