7

我有一个带有类型库的 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# 应用程序的组件,我添加了对 C# 项目的引用并生成了一个互操作程序集。

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

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

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

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

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

4

2 回答 2

7

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

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

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

于 2009-07-31T07:03:22.047 回答
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 重新生成互操作程序集。这显然是一个痛苦的过程,需要做很多额外的工作。此功能旨在解决此问题。

回归测试工具

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

于 2009-07-31T06:47:20.583 回答