我正在使用tlbexp.exe
从C#项目生成类型库。该项目包含2个文件 - 让我们称之为F1和F2 - 使用COM接口声明。 F1和F2包含仅在大小写不同的标识符(F1具有属性“Foo”,F2具有变量名称“foo”)。因此,我受“MIDL更改生成的类型库中的标识符的情况”问题的影响(参见this MSDN article,或this SO question)。
现在有趣的是,tlbexp.exe
有时会生成一个正确的类型库,有时它会生成一个不正确的类型库:
tlbexp.exe
已经按F1,F2 tlbexp.exe
已按F2,F1。现在我的问题是:tlbexp.exe
导致这种奇怪和非威慑行为的原因是什么?请注意,我出于好奇而问这个问题 - 我已经通过将两个文件F1和F2合并为一个来解决我的类型库问题。
如果它很重要:我有Visual Studio 2010 SP1,我的项目设置为使用.NET 4.
this SO question的答案声称这是非确定性的编译顺序。我发现这很难相信 - 鉴于完全相同的输入和完全相同的构建工具,非确定性行为意味着构建工具制造商必须为其构建工具配备“随机生成器”,以确保编译顺序不是每次都一样。这不太可能吗?或者我忽略了什么?
说了这么多,我试图通过将MSBuild构建输出从“minimal”增加到“diagnostic”来验证编译顺序。看一下构建输出,我看到这样一行代表一个失败的构建:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe [...] F1.cs F2.cs [...]
如您所见,文件以正确的顺序显示F1,F2。我将其与成功构建进行了比较,csc.exe
命令行完全相同。所以看起来好像编译顺序不是问题。
编辑:我理解tlbexp.exe
可能不是根本原因,所以这个问题的标题可能有点不合适。