2009-07-31 10 views
6

タイプライブラリを持つVC++ COMコンポーネントがあります。私はC#プロジェクトへの参照を追加するC#アプリケーションと相互運用アセンブリからコンポーネントを消費するためにinteropアセンブリ内の名前の大文字化が正しくありません

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

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

が生成される:このコンポーネントのタイプライブラリは、インターフェイスおよび共クラスを宣言する。私は相互運用が含まれていることを確認のVisual Studio 2003のオブジェクトブラウザで

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

それは、クラスやインタフェースの何らかの理由で名前は大文字と小文字が異なることは明らかです。これは、同じタイプライブラリで宣言された他の20以上のインタフェースでは発生しません。ISomethingSomethingSomethingClassに対応します。

私はプロジェクトの.idlファイルを調べました。識別子Workflowは他の場所では使用されていません。

この奇妙な動作の理由とその回避方法は何ですか?

答えて

6

はあなたのコードを見ての正確なスペルと大文字を持っている任意のパラメータ、プロパティ、またはメソッド名があるかどうかを確認します"ワークフロー"。これは、ほぼ確実にCOMインターフェイス関数のパラメータになります。名前をparamWorkflowに変更すると、問題はなくなります。

どうしてですか?型ライブラリツールには、内部的に大文字と小文字を区別しないで識別子を格納するバグがあります。したがって、あなたが異なる能力を持つ2つの名前を持つ場合、それらは同じスロットに格納されます。これらの名前は生成時に直接使用され、異なるケーシングが生成されます。

これを回避する方法は、異なる名前を作成して競合を防止することです。

+0

プロジェクト内のすべてのIDLファイルを調べました。名前は他の場所では使用されていません。 – sharptooth

+0

ありがとうございます。私はこの問題を抱えていて、あなたの解決策はそれを修正しました。 – Grokys

2

これは本当に起こります。名前がついたプロパティと、変更されて衝突した別のメソッドのパラメータがありました。同じ名前、別のケーシング - うわー。物事をさらに面白くするために、2つのビルドターゲットがあります.1つの資本金が1つになるビルドオーダーについては、十分に異なったものがありました。両方のプロジェクトが同じソースと.slnファイルなどをチェックアウトすると本当に楽しいです。

関連する問題