tlbexp.exe在2012年与2010年之间输出不同的tlb信息

时间:2014-06-19 20:38:07

标签: c# com-interop

我有一个C#程序集使用“$(FrameworkSDKDir)\ Bin \ NETFX 4.0 Tools \ tlbexp.exe”“$(OutDir)My.dll”/ out:"$(TLBDir)My.tlb“所以我可以从本机组件中调用它

我在看 .tlh generated on 2 machines is different它似乎是一个类似的问题,但我的不同之处在于visual2010使用一个案例生成tlh,而在2012年,它是使用不同的案例生成的。

更有趣的是,这只发生在一天前。我有一个18世纪的版本,运行得很好,代码在这两种解决方案中都没有改变很多天。

在继续使用/ Names选项之前有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我不能轻易告诉你如何解决这个问题,只是强调为什么会这样。它与Tlbexp.exe没有多大关系,它是在Windows内置的类型库支持中实现的通用行为。

它有一个棘手的问题需要解决,它无法对用于生成类型的语言的做出任何假设。麻烦制造者是不区分大小写的语言,Visual Basic就是最好的例子。也是发明类型库的原始语言。问题是它可能会发出名称,这些名称可以在不同的声明中具有不同的大小写但标识相同的类型。如果类型库使用相同的大小写,那么它只能由语言不敏感的编译器使用。

所以它做了一些事情,它使用的算法最多可以描述为。它查看任何名称,无论它使用的声明的哪一部分,然后强制它遇到的任何后续相同名称的大小写到同一个大小写。通常的重大惊喜是由函数参数的名称引起的。如果它碰巧匹配,它们可以更改函数的名称。所以"项目"争论,非常普遍,可以破坏"项目"属性。或者相反。

这里的外卡是 order ,我想这可能是半个解释。

解决问题的最佳方法是更改​​名称,以便不再发生冲突。你找到它们没有问题,它改变了套管。您可能需要迭代几次才能找到它们。鉴于它通常是导致此的参数的名称,请随意更改参数名称。例如,在它之后加上一个下划线,它不会破坏二进制兼容性,也不会破坏客户端代码。