小编gre*_*mac的帖子

将WiX 3.5与WiX 3.0一起安装

是否可以同时安装WiX 3.0和3.5?如果我在安装3.0后安装3.5,它将删除3.0文件 - 如果我尝试在3.5之后安装3.0,它会告诉我已经安装了更新的版本.

我正在从VS 2008迁移到VS 2010,因此我的应用程序的一个版本(分支)是使用VS 2008(现有生产版本),另一个版本是VS 2010(未来版本).VS2010需要WiX 3.5.

这意味着我的构建服务器,目前,我无法构建当前版本和新版本,因为将报告有关未找到WiX文件的错误:

c:\buildAgent\work\fe55ddb47cebe4fd\MyApp.wixproj(25, 11): error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.0\Wix.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

我不想将我的产品的当前版本升级到WiX 3.5,因为3.5仍处于测试阶段,因为我不得不挑选每周一次的构建以使其完全正常工作(我只是希望到时候我的下一个版本准备就绪,WiX 3.5将保持稳定).

有没有办法并排安装?我只需要将3.0文件复制到Msbuild目录中吗?

msbuild wix

9
推荐指数
1
解决办法
2979
查看次数

GetHostEntry非常慢

我有一个WinForms应用程序,我正在尝试获取表单上显示的IP列表的反向DNS条目.

我遇到的主要问题是System.Net.Dns.GetHostEntry非常慢,特别是当没有找到反向DNS条目时.使用直接DNS,这应该很快,因为DNS服务器将返回NXDOMAIN.在内部,它调用ws2_32.dll中则getnameinfo() ,其中规定"名称解析可以通过域名系统(DNS),本地hosts文件,或通过其他命名机制" -所以我假设它的那些"其他命名机制"这导致它如此缓慢,但有谁知道这些机制是什么?

通常,每个IP需要5秒,除非它找到反向条目,然后它几乎是立即的.我使用线程部分地解决了这个问题,但由于我正在做一个大型列表而且我只能同时运行这么多线程,所以它仍然需要一段时间来完成它们.

有没有更好的方法来查找更快的反向DNS条目?

.net dns

8
推荐指数
3
解决办法
2万
查看次数

业务对象/数据库访问层的体系结构

由于各种原因,我们正在编写一个新的业务对象/数据存储库.该层的要求之一是分离业务规则的逻辑和实际的数据存储层.

可以有多个数据存储层实现对同一对象的访问 - 例如,实现大多数对象的主"数据库"数据存储源,以及实现User对象的另一个"ldap"源.在这种情况下,用户可以选择来自LDAP源,可能具有稍微不同的功能(例如,无法保存/更新User对象),但是否则应用程序以相同的方式使用它.另一种数据存储类型可能是Web服务或外部数据库.

我们有两种主要方式来实现这一点,而我和同事在基本层面上是不一致的,这是正确的.我想就哪一个最好用的建议.我会尽量保持对每个人的描述尽可能保持中立,因为我在这里寻找一些客观的观点.

  • 业务对象是基类,数据存储对象继承业务对象.客户端代码处理数据存储对象.

    在这种情况下,公共业务规则由每个数据存储对象继承,并且它是客户端代码直接使用的数据存储对象.

    这暗示客户端代码确定将哪个数据存储方法用于给定对象,因为它必须显式地向该类型的对象声明实例.客户端代码需要明确知道它正在使用的每种数据存储类型的连接信息.

    如果数据存储层为给定对象实现不同的功能,则客户端代码在编译时明确地知道它,因为该对象看起来不同.如果更改了数据存储方法,则必须更新客户端代码.

  • 业务对象封装数据存储对象.

    在这种情况下,业务对象由客户端应用程序直接使用.客户端应用程序将基本连接信息传递给业务层.关于给定对象使用哪种数据存储方法的决定是由业务对象代码做出的.连接信息将是从配置文件中获取的一大块数据(客户端应用程序并不真正知道/关心它的详细信息),它可以是数据库的单个连接字符串,也可以是各种数据存储类型的多个连接字符串.还可以从另一个地点读取附加数据存储连接类型 - 例如,数据库中的配置表,其指定各种web服务的URL.

    这里的好处是,如果将新数据存储方法添加到现有对象,则可以在运行时设置配置设置以确定使用哪种方法,并且它对客户端应用程序完全透明.如果给定对象的数据存储方法发生更改,则无需修改客户端应用程序.

  • 业务对象是基类,数据源对象是从业务对象继承的.客户端代码主要处理基类.

    这与第一种方法类似,但客户端代码声明了基本业务对象类型的变量,而业务对象上的Load()/ Create()/ etc静态方法返回了相应的数据源类型对象.

    此解决方案的体系结构与第一种方法类似,但主要区别在于决定哪个数据存储对象用于给定的业务对象是由业务层而不是客户端代码.

我知道现有的ORM库已经提供了一些这样的功能,但请暂时折扣(有可能用这些ORM库之一实现了数据存储层) - 另请注意我故意不告诉你这里使用的是什么语言,除了它是强类型的.

我正在寻找一些关于哪种方法更好用(或随意提出其他建议)的一般建议,以及为什么.

architecture orm

7
推荐指数
1
解决办法
5884
查看次数

分层组的数据库模式

我正在为用作大型系统基础的组层次结构进行数据库设计.每个组都可以包含其他组,也可以包含"设备"作为叶子对象(设备下方没有任何内容).

正在使用的数据库是MS SQL 2005.(尽管在MS SQL 2000中工作将是一个奖励;但遗憾的是,此时需要MS SQL 2008的解决方案不可行).

有不同类型的组,这些组需要是动态的,并且在用户运行时是可定义的.例如,组类型可以是"客户","帐户","城市"或"建筑物","楼层",并且每种类型将具有可由用户定义的不同属性集.还将应用业务规则 - 例如,"楼层"只能包含在"建筑"组下面,并且这些可以在运行时定义.

许多应用程序功能来自基于这些组运行报告,因此需要一种相对快速的方法来获取某个组(以及所有子组)中包含的所有设备的列表.

使用修改的预订树遍历技术存储组具有快速的优势,但缺点是它相当复杂和脆弱 - 如果外部用户/应用程序修改数据库,则存在完全破坏的可能性.我们还实现了一个ORM层,这个方法似乎在大多数ORM库中使用关系变得复杂.

使用公用表表达式和"标准"id/parentid组关系似乎是避免运行多个递归查询的有效方法.这种方法有什么缺点吗?

至于属性,存储它们的最佳方法是什么?一个长而窄的桌子,与群体有关?是否应该将一个公共属性(如"name")存储在groups表中,而不是存储在属性表中(很多时候,名称将只显示所需的名称)?

是否会出现使用此方法的性能问题(假设在一个合理的硬件上,平均每个平均有6个属性,平均10个并发用户,例如,四核Xeon 2 Ghz,4GB ram ,折扣任何其他过程)?

随意提出一个与我在此概述的完全不同的架构.我只是想说明我关心的问题.

database sql-server database-design

6
推荐指数
1
解决办法
3348
查看次数

如何从VisualStudio构建后事件启动后台任务?

我正在尝试从VisualStudio运行特定项目时启动grunt监视的实例.我有一个用ember编写的页面应用程序,并使用grunt编译,它连接到用WebAPI编写的后端.我正在尝试减少摩擦,因此可以在VS中启动调试(F5)并让它完成所有工作.

如果我添加一个post-build事件来使用grunt编译应用程序,它可以正常工作:

node node_modules\grunt-cli\bin\grunt dev --no-color
Run Code Online (Sandbox Code Playgroud)

grunt watch 永远不会终止,因此VisualStudio构建似乎会挂起,直到你终止node.exe进程(除了无法使用Ctrl + Break在VS中停止之外,这是主要的预期):

node ../node_modules\grunt-cli\bin\grunt watch --no-color
Run Code Online (Sandbox Code Playgroud)

我尝试从start命令开始,但VisualStudio仍然等待它退出(只是说"Build started ..."):

start node ../node_modules\grunt-cli\bin\grunt dev --no-color
Run Code Online (Sandbox Code Playgroud)

我也尝试过start的/i参数,但这没有用.它打开一个新的窗口运行grunt watch,但在我关闭控制台窗口之前,构建不会继续(应用程序不会启动).

在此输入图像描述

据推测,这与构建过程的子进程有什么关系?有没有一个实际的方法来启动后台任务没有VisualStudio等待它?

msbuild visual-studio-2010 background-process post-build-event

6
推荐指数
1
解决办法
1430
查看次数

如何包含一次可用于可执行文件和表单的图标?

.ico我尝试对应用程序可执行文件和应用程序内的表单使用单个文件(具有多种大小),而不在可执行文件中包含两次图标。

我注意到这一点是因为我的应用程序(没有图标)编译为 600KB,图标为 300KB,但是当我使用这两个应用程序时,编译的应用程序增加到 1200KB,表明它被嵌入了两次。

这是我尝试过的:

(1) 使用UI选取图标文件

  1. 转到“应用程序属性”>“应用程序”>“资源”>“图标”,然后使用“...”按钮选择MyIcon.ico文件。
    • 编译后的exe现在是900KB
  2. 转到“表单属性”>“图标”并使用“...”按钮选择MyIcon.ico文件。
    • 编译后的exe现在是1200KB

(2)使用资源

  1. 转到应用程序属性 > 资源 > 图标 > 添加现有文件并选择MyIcon.ico文件
  2. 在表单构造函数中添加:this.Icon = Properties.Resources.MyIcon;
    • 编译后的exe现在是900KB
  3. 转到“应用程序属性”>“应用程序”>“资源”>“图标”,然后选择Resources\MyIcon.ico(在下拉列表中列出)
    • 编译后的exe现在是1200KB

显然,它仍然第二次包含该文件,而不是引用嵌入资源。

(3) 使用Icon.ExtractAssociatedIcon()

  1. 转到“应用程序属性”>“应用程序”>“资源”>“图标”,然后使用“...”按钮选择MyIcon.ico文件。
    • 编译后的exe现在是900KB
  2. 在表单构造函数中,添加this.Icon = Icon.ExtractAssociatedIcon(AppDomain.CurrentDomain.FriendlyName);
    • 编译后的exe仍然是900KB,但图标是Windows中的通用“exe”图标,而不是我的应用程序的图标

在我深入探讨这个问题之前,我是否遗漏了一些明显的东西?有没有标准的方法来做到这一点?难道只是我使用Icon.ExtractAssociatedIcon()不当?

c# embedded-resource ico winforms

6
推荐指数
1
解决办法
4597
查看次数

执行.NET应用程序时验证authenticode签名

我觉得我在这里遗漏了一些明显的东西,但我不认为它写在任何地方.

我使用Authenticode证书签署我的可执行文件,但是当我开始学习更多关于它的信息时,我正在质疑它的价值.

  • 签名的exe具有数字证书,该证书显示为"有效"证书.当您从互联网上下载此类文件时,它会在Windows中显示一条警告,提示您即将从Xyz Corporation发布的可能不安全的位置运行程序.
  • 如果没有签名,下载的文件将提供一个完全不同的警告框,说明该文件不受信任

现在,我关心的是:

  • 如果更改了签名的exe,当您进入"属性">"数字签名">"选择签名">"详细信息..."时,将显示"此数字签名无效".这是一个非常模糊的方式来查看可能是一个严重问题,以及一个巨大的指标,你不应该运行该文件.

    • 如果您从Windows运行此文件(未下载),它将运行正常.没有任何警告或任何迹象表明存在问题
    • 我没有检查如果你下载文件然后尝试运行它会发生什么.
  • 如果从文件中剥离签名(使用delcert),则表示没有任何错误.同样,您可以运行该文件,并且在属性对话框中不会显示任何证书.


为了使这更有用,我认为签名文件需要验证自己.启动时,应检查是否存在有效签名,并且签名的sha1指纹可能与Xyz Corporation证书的预期签名匹配.

(当然,这仍然无法处理有人剥离证书,然后编辑文件以删除证书检查的情况)


我找不到任何人在谈论如何做到这一点(至少不是在.NET中,当然也不是像我期望的那样简单的API调用) - 所以这导致了几个问题:

  1. 有没有理由不检查签名?没有这项检查,还有哪些其他好处?
  2. 是否试图将签名验证为篡改检测手段如此徒劳,以至于尝试无意义?
  3. 如何检查.NET中当前可执行文件的证书?

.net authenticode

5
推荐指数
1
解决办法
1615
查看次数

SQL:按特定顺序从自引用表中删除数据

我有这样一张桌子:

groupId guid PK
parentId guid
name
left int
right int
Run Code Online (Sandbox Code Playgroud)

从parentId到groupId有一个外键(这是一个自引用表).

左和右是用于维护层次结构的MPTT左/右值.这里要注意的重要事项是左值越大,项目嵌套越深(换句话说:对于任何给定的项目,其左值总是大于所有父项的左值).


我正在尝试编写一个快速的DELETE语句来删除除最顶层组(总是有一个空的GUID值)之外的所有内容,例如:

DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000'`
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为在任何给定组下面通常存在防止删除的子组.如果反复运行DELETE查询,最终会删除所有内容,但这显然不是一个好的解决方案.

我想要的是相当于:

DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000' 
ORDER BY [left] DESC
Run Code Online (Sandbox Code Playgroud)

当然,这是不允许的语法,但实际上,它应该首先删除具有最大左值的项目,以确保下面没有可防止由于FK约束而删除的组.

我也尝试过:

delete from [group] where groupid in (
  select top 1000000 * from [group] 
  where groupid <> '00000000-0000-0000-0000-000000000000' 
  ORDER BY [left] desc
)
Run Code Online (Sandbox Code Playgroud)

这是有效的语法(如果你也使用TOP,你只能使用ORDER BY)但实际上并没有导致DELETE按返回的行的顺序发生,所以它仍然不起作用.

这是可以做到的,而无需借助光标逐个删除行吗?

t-sql sql-server-2005

5
推荐指数
1
解决办法
1810
查看次数

如何在SQL Server连接字符串中隐藏用户标识/密码?

在重新发明轮子之前,是否有一种标准方法可以在SQL Server连接字符串中隐藏至少一个密码?

(用C#编写)

我有一个高度多线程的应用程序,它知道多个数据库,因此为了帮助进行故障排除和调试,可以记录连接字符串的各个位置.我无法控制使用此产品的客户使用什么连接字符串,因此在其中找到密码并不常见.我知道这是因为它也并不少见,人们打开调试级记录,并给我们的日志文件有问题报告一起,这些日志中包含的数据库密码(和结果我们的支持票系统包含口令).

我知道最好的做法是不要把连接字符串中的密码,但一部分是出于我的控制(当然,除非我们改变我们的应用程序,所以它拒绝,如果你给它用未加密的密码连接字符串跑......这似乎对我来说有点严厉).

真的希望我想要它的日志是:

Server=myServerAddress;Database=myDataBase;User Id=****;Password=*****;
Run Code Online (Sandbox Code Playgroud)

(如果用户ID /名称是否是敏感信息,或者/或者对于日志记录是否有用 - 我对此表示欢迎).

我可以构建一个简单的正则表达式(例如/Password=[^;]+/),但在此之前,我只是想看看是否还有其他情况我不考虑,特别是如果已经完成的话.

.net c# sql-server security connection-string

5
推荐指数
1
解决办法
3407
查看次数

有没有一种干净的方法来返回 FilePathResult 并随后删除磁盘上的文件?

我有一个类,它使用外部进程来创建文件,并作为下载结果返回,此时我想从服务器中删除该文件。我通常喜欢避免临时磁盘文件,但在这种情况下这是无法避免的。


我最初尝试使用 Dispose 方法来实现这一点:

public class SetupFile : IDisposable 
{
    /// <summary>Local file path</summary>
    public string LocalFilePath { get; set; }
    /// <summary>Filename to present to user</summary>
    public string DownloadFilename { get; set; }

    public void Dispose()
    {
        System.IO.File.Delete(LocalFile);
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器代码创建并操作该文件,然后将结果返回为FilePathResult

public class DownloadController : Controller 
{
    public SetupFileGenerator Generator { get; set; } 
    public DigitalSignatureTool Signer { get; set; }

    [HttpPost, Route("/download")]
    public ActionResult Download(InstallParams params) 
    {
        using (SetupFile file = Generator.Generate(params)) {
        {   
            Signer.Sign(file.LocalFilePath); // …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc

5
推荐指数
1
解决办法
2379
查看次数