在互操作程序集的名称有误资本

问题描述 投票:7回答:2

我有一个类型库的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对应SomethingSomethingClass

Workflow不使用其他任何地方的标识 - 我已经通过该项目的.idl文件看去。

什么的这种奇怪的行为的原因,怎么能左右的工作?

c# .net com interop typelib
2个回答
7
投票

看看你的代码,看看是否有任何参数,属性或方法,其中有“工作流程”的确切拼写和大小写的名字。几乎可以肯定将是一个COM接口函数的参数。更改名称是paramWorkflow和你的问题就会消失。

为什么会出现这种情况?有类型库中的工具,在那里他们将存储标识符不区分大小写的方式在内部的错误。所以,如果你有不同的capatilization两个名字,他们将被存储在同一插槽。这些名称然后直接在生成时使用,从而不同的外壳将被发射。

解决这一问题的方法是通过创建不同的名称,以避免冲突。


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来重新生成interop程序集。这显然是一个痛苦的过程,需要大量的额外工作。此功能旨在解决这个问题。

回归测试工具

为了帮助开发人员,以确保他的改变不会造成任何的回归,我们已经开发出一种简单的回归测试工具

© www.soinside.com 2019 - 2024. All rights reserved.