互操作程序集中的名称具有错误的大小写

时间:2009-07-31 06:43:52

标签: c# .net com interop typelib

我有一个带有类型库的VC ++ COM组件。该组件的类型库声明了一个接口和一个co-class:

[
    object,
    uuid( ActualUuidHere),
    dual,
    nonextensible,
    oleautomation,
    hidden,
    helpstring( ActualHelpStringHere )
]
interface IWorkflow : IDispatch 
{
    //irrelevant properties here    
}

[
    uuid(ActualClassIdHere),
    noncreatable
]
coclass Workflow {
    [default] interface IWorkflow;
};

为了从C#应用程序中使用组件,我添加了对C#项目的引用,并生成了一个interop程序集。

在Visual Studio 2003的对象浏览器中,我看到互操作包含:

public abstract interface IWorkflow;
public abstract interface workflow : IWorkflow;
public class workflowClass : System.Object;

很明显,由于某种原因,类和接口的名称大小写不同。在同一类型库中声明的其他20多个接口不会发生这种情况 - 对于它们ISomething对应SomethingSomethingClass

我查看了项目的.idl文件 - 标识符Workflow未在其他地方使用。

这种奇怪的行为是什么原因以及它如何解决?

2 个答案:

答案 0 :(得分:7)

查看代码,看看是否有任何参数,属性或方法名称具有“工作流程”的确切拼写和大小写。它几乎肯定是COM接口函数的参数。将名称更改为paramWorkflow,您的问题应该消失。

为什么会这样?类型库工具中存在一个错误,它会在内部以不区分大小写的方式存储标识符。因此,如果您有两个具有不同capatilization的名称,它们将存储在同一个插槽中。然后在生成时直接使用这些名称,以便发出不同的外壳。

解决此问题的方法是通过创建不同的名称来防止冲突。

答案 1 :(得分:1)

看一下新的可自定义的tlbimp工具:

https://blogs.msdn.microsoft.com/dotnet/2009/03/19/new-tlbimp-release-on-codeplex-full-customization-of-interop-assemblies/

  

基于规则的互操作程序集自定义

     

新的TlbImp实用程序允许用户自定义互操作程序集   TlbImp中的转换过程,通过指定一组规则   自定义指定的类型/功能/签名。我们收到了很多   来自TlbImp用户的反馈,他们希望能够制作他们的   在构建过程中对互操作程序集进行了更改,以及它们   最终使用ILDASM将互操作程序集拆分为IL代码,   使用PERL脚本修改它,然后使用ILASM重新生成   互操作程序集。这显然是一个痛苦的过程,需要一个   很多额外的工作。此功能旨在解决此问题   问题

     

回归测试工具

     

为了帮助开发人员确保他的更改不会导致任何变更   回归,我们开发了一个简单的回归测试工具