我有一个类型库的VC ++ COM组件。该组分的类型库声明一个接口和共类:
[
object,
uuid( ActualUuidHere),
dual,
nonextensible,
oleautomation,
hidden,
helpstring( ActualHelpStringHere )
]
interface IWorkflow : IDispatch
{
//irrelevant properties here
}
[
uuid(ActualClassIdHere),
noncreatable
]
coclass Workflow {
[default] interface IWorkflow;
};
为了从C#应用程序消耗分量I的引用添加到C#的项目,并产生一个互操作程序集。
在Visual Studio 2003中的对象浏览器我看到互操作包含:
public abstract interface IWorkflow;
public abstract interface workflow : IWorkflow;
public class workflowClass : System.Object;
很明显,由于某种原因类和接口的名字大小写不同。这不会发生在同类型库中声明超过20个其他接口 - 他们ISomething
对应Something
和SomethingClass
。
Workflow
不使用其他任何地方的标识 - 我已经通过该项目的.idl文件看去。
什么的这种奇怪的行为的原因,怎么能左右的工作?
看看你的代码,看看是否有任何参数,属性或方法,其中有“工作流程”的确切拼写和大小写的名字。几乎可以肯定将是一个COM接口函数的参数。更改名称是paramWorkflow和你的问题就会消失。
为什么会出现这种情况?有类型库中的工具,在那里他们将存储标识符不区分大小写的方式在内部的错误。所以,如果你有不同的capatilization两个名字,他们将被存储在同一插槽。这些名称然后直接在生成时使用,从而不同的外壳将被发射。
解决这一问题的方法是通过创建不同的名称,以避免冲突。
看看新的定制TLBIMP工具:
的互操作程序集有章可循的定制
新TLBIMP实用程序允许用户定制内TLBIMP互操作程序集转换过程中,通过指定一组规则以定制特定类型/功能/签名。我们已经收到了很多反馈TLBIMP用户,他们希望让自己改变其构建过程中的互操作程序集的能力,他们最终使用ILDASM拆卸互操作组装成IL代码,使用PERL修改脚本,然后使用ILASM来重新生成interop程序集。这显然是一个痛苦的过程,需要大量的额外工作。此功能旨在解决这个问题。
回归测试工具
为了帮助开发人员,以确保他的改变不会造成任何的回归,我们已经开发出一种简单的回归测试工具