小编Rob*_*t P的帖子

适用于.NET应用程序的连接器状态(又名"请先生,我可以拥有链接器"2009版)

这里的很多人可能都熟悉Joel Spolsky最受欢迎的博客文章之一,请主席先生,我可以有一个链接器,在那里他呼吁一种方法来删除.NET框架的依赖关系,这样就可以开发一个独立的应用程序,出售.

Visual Studio开发团队的Jason Zander当时回答了他对这个主题的看法,认为这个话题有点没有意义 - 在运行时(以及其他方面)修复安全问题的能力是他们的主要关注点.总的来说,小开销是值得的.

快进到2009年.现在有几个团体声称拥有C#链接器.(Jason Zander甚至自己说实现它不会花太多时间.)我们现在拥有一个庞大的200-300 mb跨平台完整的.NET 3.5安装程序,而不是可爱的,十几个下载的.NET 1.0.包含用于x86,x64和ia64的.NET版本.微软建议减少运行时间大小包括:

  • 解压缩可再发行组件,删除不需要的目标平台,然后将其重新组合在一起
  • 使用仅为您的平台下载库的Web引导程序
  • 使用具有有限库的Client Profile安装程序(2008年末新增),仅适用于x86

更糟糕的是,正如我所理解的那样(如果我错了请纠正我)客户端配置文件甚至没有注册Windows,因为安装了.NET 3.5.这意味着如果计算机上安装了多个.NET 3.5客户端应用程序,则没有人会看到对方,并且将一次又一次地重新安装运行时!

我真的不知道微软在想什么.即使假设最坏的情况安装将是针对一个目标平台(例如,x64)并且仅需要包括那些库,您仍然在应用程序上查看超过60 MB的开销.即使是最着名的.NET应用程序之一,Paint.NET,由于存在大量的.NET依赖性,因此很难安装应用程序. 如果他们在分发免费应用程序时遇到问题,那么世界其他地方呢?最后,他们必须制作一个安装Microsoft Installer 3.1,.NET运行时引导程序以及所有其他依赖库的引导程序,然后才能安装自己的应用程序.

那怎么样呢.链接器.是否存在任何好的 - 或者只是简单地构建C#应用程序而不需要用户安装大量.NET运行时的工具?

更新:所以,看起来有几个选项:

单声道:

.净:

看起来Mono工具正在使用; 基于.NET的工具怎么样?与他们有任何其他经验,或者我们只是要等待微软将其推向每个人?我不禁想到将.NET 4.0推出需要多长时间......

.net c# vb.net mono linker

70
推荐指数
3
解决办法
6435
查看次数

在Mercurial中组织具有共享依赖项的项目的好方法是什么?

目前,我正在从遗留版本控制系统转移并将我的团队项目转移到mercurial.作为我正在移动的代码类型的一个例子,我有一个25+项目的Visual Studio解决方案,包含几个独立的应用程序区域,这些区域都依赖于公共代码.查看Stack Overflow,我发现的最接近的问题就是这个问题,但它只提到了版本控制.我正在寻找有关使用Mercurial管理这些依赖项的具体实现技术的进一步建议.

依赖关系的简化视图如下所示.(这仅用于说明和示例;实际依赖性明显更复杂,但性质相似.)

                     Common Lib 1
                    /      |      \
                ----       |       -----   
               /           |        \   \
            App 1    Common Lib 2    \ App 2
                       /   |   \      \
                -------    |    ------ |
               /           |          \|
             App 3       App 4      App 5
Run Code Online (Sandbox Code Playgroud)

Common Lib模块将是共享代码 - 这将是一个DLL或SO或一些其他库,可以在编译和运行时同时在所有应用程序之间使用.否则,应用程序将能够彼此独立地运行.

设置我的mercurial存储库有几个目标:

  • 为每个重要的应用程序或组件组提供自己的存储库
  • 使每个存储库自包含.
  • 使项目的总和自包含.
  • 可以轻松地立即构建整个代码库.(最终,所有这些程序和库最终都在一个安装程序中.)
  • 把事情简单化.

另一点是我有一个服务器设置,我为每个项目都有单独的存储库.

我看到了几种铺设这些项目的方法.

1.创建一个包含所有内容的"Shell"存储库.

这将使用基于url的子版本(例如,在.hgsub中,我会做类似的事情.)做出来,它将如下所示:App1 = https://my.server/repo/app1

+---------------------------+
| Main Repository           |
| | +---------------------+ |
| +-| Build               | |
| | +---------------------+ |
| …
Run Code Online (Sandbox Code Playgroud)

mercurial project-management subrepos

62
推荐指数
1
解决办法
4869
查看次数

使用WiX安装程序复制Visual Studio COM注册

曾几何时,一位年轻,天真的工程师认为将他的应用程序的一些功能分成一个用C#编写的COM组件是个好主意.Visual Studio拥有所有这些工具,对吧?.NET实际上是为此做的,对吗?哈!他说,这很容易.我将对组件进行适当的分离,使业务逻辑远离前端,而使用COM,我将能够在任何地方使用它!他愉快地检查了register for COM interop项目属性中的复选框,暴露了他想要的分类,然后继续前进.

哦,试验这样的选择.这位年轻的工程师现在更有经验,现在不希望任何人这样做.但是,肩负重担,负担仍然沉重.他希望减轻负担.

随之而来的是WiX,一种用于从XML生成Windows Installer文件的工具.这引起了他的兴趣 - 它可以简单地从一些配置文件复制一个正确的Windows安装程序文件所需的大部分代码.他的目光正在抬头.

使用WiX 2.0,他可以很容易地生成注册C#COM对象所需的文件.这涉及使用工具牛油.他会做以下事情:

tallow -c -nologo MyComExposedLibrary.dll > MyComExposedLibrary.wxs
Run Code Online (Sandbox Code Playgroud)

然后将其修复(首先这是手动完成的,但最终我将步骤记录到一个小工具集中,最终目录引用ID,组件ID,文件ID,GUID和代码库).

然后,随后的安装程序将安装,如果应用程序工作,将有欢乐的庆祝活动.

它没有.

几天来,年轻的工程师倾注了他的开发PC和测试安装PC的差异."所有的注册表键都是一样的!" 他会惊呼."对于MyComExposedLibrary的所有内容都已注册,我发誓!"

除此之外,事实并非如此.

在第三天的黎明之后,经过许多山露,他意识到Visual Studio正在注册的另一个对象是他的安装程序不是:MyComExposedLibrary.tlb文件.

显然,Visual Studio一直在注册此文件,在HKLM\Software\Classes\Interface注册表项中创建其他子项,并在其中注册typelib HKLM\SOFTWARE\Classes\TypeLib.

Tallow没有给出任何帮助,抱怨说.tlb不是一个文件.也不是WiX 3.0测试版 - 这似乎有更多的问题让事情发挥作用.

我也尝试了热火.这生成了注册表元素和类元素.我清理了热量的输出,然后去编译它,但得到了一个不同的错误:error LGHT0130 : The primary key <uuid here> is duplicated in table 'Registry'.问题是,据我所知,uuid实际上并不存在于我的任何wxs源文件中.如果我在我的feature元素中改变组件引用顺序,则另一个dll组件会给出该错误.由于我没有成功完成项目的WiX 3.0版本的编译,我无法确认热量是否能提供正确的输出.

我从安装程序中删除了所有内容,除了导致出现此错误的程序集之一并再次尝试编译.我得到了同样的错误.Arrugh!

所以,我的好伙伴,Windows爱好者和WiX用户都有两个问题:

  • WiX可以本地注册的类型库吗?如果是这样,怎么样?
  • 如果没有,使用Windows安装程序注册typelib的正确方法是什么?

此外,我想作为另一部分,Visual Studio如何确定如何注册typelib?(编辑:看起来关于typelib注册MSDN库文章有所需的密钥的名称,但我仍然需要弄清楚如何获取uuid的.(这是关于typelib的博客文章和Larry Osterman的COM注册.))再读一点,手动注册这些位可能会让我失望,但我希望不是......

我评估了输出regasm /regfile:MyDll.dll MyDll.dll.看起来这些是wix为dll生成的密钥.Regasm的另一种模式,regasm /tlb:<filename>生成并注册程序集的类型库,但是,

/ regfile [:FileName]生成具有指定名称的reg文件,而不是注册类型.此选项不能与/ u或/ tlb选项一起使用 …

.net windows com wix typelib

36
推荐指数
2
解决办法
1万
查看次数

Perl的一些优雅功能或用途是什么?

什么?Perl漂亮吗? 优雅?他一定是在开玩笑!

这是真的,那里有一些丑陋的Perl.有些人,我的意思是很多.我们都看过了.

嗯,这是象征汤.不是吗?

是的,有符号.就像'数学'有'符号'一样.只是我们程序员更熟悉标准的数学符号.我们开始接受母语中的符号,无论是ASM,C还是Pascal.Perl刚决定再多做一些.

好吧,我认为我们应该摆脱所有不必要的符号.使代码看起来更好.

这样做的语言已经存在.它被称为Lisp. (很快,perl 6.)

好的,聪明的家伙.事实是,我已经可以发明自己的符号了.它们被称为功能和方法.此外,我们不想重塑APL.

哦,假冒的另一个自我,你真好笑!这是真的,Perl可以很漂亮.它也可能非常丑陋.使用Perl,TIMTOWTDI.

那么,你最喜欢的Perl代码是什么?

perl

35
推荐指数
9
解决办法
2250
查看次数

是否有可用于CLR的高分辨率(微秒,纳秒)DateTime对象?

我有一个仪器存储时间戳微秒级别,我需要存储这些时间戳作为从仪器收集信息的一部分.请注意,我并不需要生成时间戳 ; 这些时间戳是由仪器本身使用高分辨率实时操作系统预先生成的.解析这些值不是问题 - 它们使用UTC时间的标准格式存储.本来我想用C#DateTime结构只能存储时间戳达毫秒级的分辨率.

是否有另一个.NET提供的对象或一个支持微观和(理想情况下)纳秒分辨率时间戳的通用C#库,或者我将不得不自己动手?

.net c# clr datetime timestamp

26
推荐指数
3
解决办法
4万
查看次数

发现Perl模块的所有子程序的最佳方法是什么?

以编程方式发现perl模块具有的所有子例程的最佳方法是什么?这可以是一个模块,一个类(没有@EXPORT),或者介于两者之间的任何东西.

编辑:下面的所有方法看起来都可以.我可能在生产中使用Class :: Sniff或Class :: Inspector.然而,莱昂的回答被标记为"被接受",因为它回答了提出的问题,即使no strict 'refs'必须使用.:-) Class :: Sniff可能是一个很好的选择,因为它的进展; 看起来很多想法已经进入其中.

reflection perl perl-module subroutine

24
推荐指数
3
解决办法
9321
查看次数

如何开始为CPAN编写模块?

现在,我有自己的自己开发的测试工具/目录结构/支持doc strucure /我的库分发工具.然而,阅读博客文章写你的代码就像CPAN一样,这听起来是个好主意.然后它发生在我身上,我真的不知道该怎么做.

有什么好的资源可以开始在类似CPAN的结构中制作自己的Perl包?

perl cpan distribution

24
推荐指数
4
解决办法
2150
查看次数

使用WiX生成和安装Typelib

询问Visual Studio注册COM库后做了什么,很明显VS为COM注册做了两件事:

  1. 注册了COM库
  2. 创建并注册类型库

Visual Studio似乎使用regasm.exe进行此注册.对于第一部分(直接COM注册)使用tallowheat(WiX 2.0或WiX 3.0)似乎可以获得所有基本的COM注册信息.

但是,动物/热似乎没有设置类型库安装.可以使用WiX安装程序和regasm.exe创建自定义操作来执行此操作,但是当涉及基于Microsoft安装程序的安装程序时,调用自定义操作不是最佳做法.

经过进一步研究,看起来msi能够在安装时生成类型库.事实上,WiX似乎直接支持它!在文件元素中,您可以添加Typelib元素.实际上,wix上的这篇文章有一个用Interface元素填充TypeLib元素的例子.

似乎Interface元素至少有两个必需的属性:

  1. ID
  2. 名称

Larry Osterman谈到了通常需要为TypeLib注册的接口的其他部分,这个接口条目似乎照顾了各个部分.Larry说我们需要将ProxyStubClassId32指定为"{00020424-0000-0000-C000-000000000046}",因此我们可以轻松添加它.

从那里去哪里以及为各种界面元素填写的内容让我感到难过.我已经继续将TypeLib元素添加到我的wix文件中,并且它已成功编译.关于如何设置Interface元素,我有点无能为力.我们需要做些什么来正确填写TypeLib元素,以及我可以使用哪些应用程序或工具来获取它?

wcoenen下面的答案看起来很有希望......我打算试一试.

更新:在下面发布我的最终解决方案作为答案.

windows windows-installer wix typelib

22
推荐指数
2
解决办法
1万
查看次数

我如何勾选Perl的印刷品?

这是一个场景.您有大量遗留脚本,都使用公共库.所述脚本使用'print'语句进行诊断输出.脚本不允许任何变化 - 它们的范围广泛,得到了批准,并且早已离开了监督和控制的富有成效的山谷.

现在出现了新的需求:现在必须将日志记录添加到库中.这必须自动且透明地完成,标准库的用户无需更改其脚本.公共库方法可以简单地添加日志记录调用; 这是最简单的部分.困难的部分在于这些脚本的诊断输出始终使用'print'语句显示.必须存储此诊断输出,但同样重要的是,处理.

作为此处理的示例,库应仅记录包含"警告","错误","通知"或"注意"字样的打印行.下面的极其琐碎和被控制的示例代码(tm)将记录一些所述输出:

sub CheckPrintOutput
{
    my @output = @_; # args passed to print eventually find their way here.
    foreach my $value (@output) {
         Log->log($value) if $value =~ /warning|error|notice|attention/i;
    }
}
Run Code Online (Sandbox Code Playgroud)

(我想避免诸如"实际上应该记录什么","打印不应该用于诊断","perl糟透了"或"此示例有缺陷xy和z'等问题......这是为简洁和清晰而大大简化.)

基本问题归结为捕获和处理传递给print的数据(或任何perl builtin,沿着这些推理线).可能吗?有什么方法干净利落的吗?是否有任何具有钩子的记录模块可以让你这样做?或者它应该像瘟疫一样应该避免,我应该放弃捕获和处理打印输出?

附加:这必须运行跨平台 - 窗口和*nix相似.运行脚本的过程必须保持不变,脚本的输出也必须保持不变.

其他附加:在codelogic的回答评论中提出了一个有趣的建议:

您可以继承http://perldoc.perl.org/IO/Handle.html并创建自己的文件句柄来执行日志记录工作. - Kamil Kisiel

这可能会这样做,有两点需要注意:

1)我需要一种方法将此功能导出到使用公共库的任何人.它必须自动应用于STDOUT,也可能是STDERR.

2) IO :: Handle文档说你不能将它子类化,到目前为止我的尝试都没有结果.是否有任何特殊需要使子类化IO :: Handle工作?标准的'使用基础'IO :: Handle'然后覆盖new/print方法似乎什么都不做.

最终编辑:看起来像IO :: Handle是一个死胡同,但Tie :: Handle可能会这样做.感谢所有的建议; 他们都非常好.我将试试Tie :: Handle路线.如果它导致问题我会回来的!

附录:请注意,在使用了这个之后,我发现如果你没有做任何棘手的事情,Tie :: Handle会起作用.如果您使用IO :: Handle的任何功能与绑定的STDOUT或STDERR,它基本上是一个让它们可靠地工作的废话 - 我找不到一种方法来获得IO :: Handle的autoflush方法来处理我的绑定处理.如果我在绑上手柄之前启用了autoflush,它就能正常工作.如果这对您有用,可以接受Tie :: Handle路线.

printing perl hook tie

20
推荐指数
3
解决办法
6784
查看次数

宣布使用哪个版本的Perl的现代方式是什么?

当谈到我们脚本需要什么版本的Perl时,我们有选择,哦,兄弟,我们有选择:

use 5.010;
use 5.010_001;
use 5.10.0;
use v5.10;
use v5.10.0;
Run Code Online (Sandbox Code Playgroud)

一切似乎都有效.perlcritic抱怨除了前两个之外的所有人.(不幸的是,v字符串似乎有这样的缺陷,因为Perl 6希望你use v6;为你的Perl 6脚本做...)

那么,我们应该做些什么来表明我们想要使用特定版本的perl?

perl version

17
推荐指数
3
解决办法
5242
查看次数