C# tlbexp.exe在2012年和2010年输出不同的tlb信息

C# tlbexp.exe在2012年和2010年输出不同的tlb信息,c#,com-interop,C#,Com Interop,我有一个C#程序集,它使用“$(FrameworkDKDir)\Bin\NETFX 4.0 Tools\tlbexp.exe”“$(OutDir)My.dll”/out:$(TLBDir)My.tlb”,以便我可以从本机组件调用它 我在看 这似乎是一个类似的问题,但我的区别在于visual2010使用一个案例生成tlh,而在2012年,使用另一个案例生成tlh 更有趣的是,这件事发生在一天前。我有一个从18日开始的构建,它运行得很好,并且两个解决方案中的代码已经有很多天没有更改了 在继续使用/N

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

我在看 这似乎是一个类似的问题,但我的区别在于visual2010使用一个案例生成tlh,而在2012年,使用另一个案例生成tlh

更有趣的是,这件事发生在一天前。我有一个从18日开始的构建,它运行得很好,并且两个解决方案中的代码已经有很多天没有更改了


在继续使用/Names选项之前,有什么想法吗?

我无法轻松地告诉您如何解决此问题,只需强调为什么会发生这种情况。它与Tlbexp.exe没有多大关系,它是在Windows内置的类型库支持中实现的一般行为

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

所以它做了一些事情,它使用的算法充其量只能说是粗糙的。它查看任何名称,而不管它使用的是声明的哪一部分,然后将它遇到的任何后续相同名称的大小写强制为相同的大小写。通常的大惊喜是由函数参数的名称引起的。如果函数名恰好匹配,它们可以更改函数名。因此,“item”参数非常常见,可能会破坏“item”属性的名称。或者反过来说

这里的通配符是顺序,我想这可以解释一半

解决此问题的最佳方法是更改名称,以便不再发生冲突。你很容易找到它们,就是换了外壳的那个。您可能需要迭代几次才能找到它们。鉴于通常是某个参数的名称导致了这种情况,请随意更改该参数的名称。例如,只需在其后面加一个下划线,它既不会破坏二进制兼容性,也不会破坏客户端代码