3

私は既存のCOMインターフェースを持っています。新しいインターフェイスを (新しい GUID で) COM として公開する .net アセンブリを作成したくありませんが、インターフェイスの構造は同じである必要があります。

このインターフェイスを公開する .net クラス (C#) を作成するにはどうすればよいですか?

[
  odl,
  uuid(1ED4C594-DDD7-402F-90DE-7F85D65560C4),
  hidden,
  oleautomation
]
interface _IFlashPhase : IUnknown {

    [propget]
    HRESULT _stdcall ComponentName(
                    [in] short i, 
                    [out, retval] BSTR* pVal);
    [propput]
    HRESULT _stdcall ComponentName(
                    [in] short i, 
                    [in] BSTR pVal);
    [propget]
    HRESULT _stdcall ComponentMolePercent(
                    [in] short i, 
                    [out, retval] double* pVal);
    [propput]
    HRESULT _stdcall ComponentMolePercent(
                    [in] short i, 
                    [in] double pVal);
    [propget]
    HRESULT _stdcall ComponentFugacity(
                    [in] short i, 
                    [out, retval] double* pVal);
    [propput]
    HRESULT _stdcall ComponentFugacity(
                    [in] short i, 
                    [in] double pVal);

};
4

1 に答える 1

8

IDL が有効ではありません。属性を持つインターフェイスは[oleautomation]、IUnknown ではなく IDispatch から派生する必要があります。適切な宣言を行い、それらを変更して独自のものを取得する必要がある場所を示します。

C# でインデックス付きプロパティを宣言することはできません。C# チームはそれらの実装を拒否しています。バージョン 4 では、COM タイプ ライブラリで宣言されているインデックス付きプロパティがサポートされていますが、それらを自分で宣言することはまだ許可されていません。回避策は、VB.NET 言語を使用することです。VB.NET 言語には問題はありません。ソリューションに VB.NET クラス ライブラリ プロジェクトを追加します。次のようにします。

Imports System.Runtime.InteropServices

Namespace Mumble

    <ComVisible(True)> _
    <Guid("2352FDD4-F7C9-443a-BC3F-3EE230EF6C1B")> _
    <InterfaceType(ComInterfaceType.InterfaceIsDual)> _
    Public Interface IExample
        <DispId(0)> _
        Property Indexer(ByVal index As Integer) As Integer
        <DispId(1)> _
        Property SomeProperty(ByVal index As Integer) As String
    End Interface

End Namespace

<DispId>、dispid 0の使用は特別であることに注意してください。これはインターフェイスのデフォルト プロパティです。これは、C# 言語のインデクサーに相当します。

VB.NET で必要なのは宣言だけです。インターフェイスの実装を C# 言語で記述することもできます。[プロジェクト + 参照の追加] の [プロジェクト] タブで、VB.NET プロジェクトを選択します。次のようにします。

using System;
using System.Runtime.InteropServices;

namespace Mumble {
    [ComVisible(true)]
    [Guid("8B72CE6C-511F-456e-B71B-ED3B3A09A03C")]
    [ClassInterface(ClassInterfaceType.None)]
    public class Implementation : ClassLibrary2.Mumble.IExample {
        public int get_Indexer(int index) {
            return index;
        }
        public void set_Indexer(int index, int Value) {
        }

        public string get_SomeProperty(int index) {
            return index.ToString();
        }

        public void set_SomeProperty(int index, string Value) {
        }
    }
}

タイプ ライブラリを生成するには、VB.NET アセンブリと C# アセンブリの両方で Tlbexp.exe を実行する必要があります。実装された C# には VB.NET が含まれています。

IDispatch ではなく IUnknown から派生するインターフェイスを取得するには、インターフェイス宣言を編集します。DispId 属性を削除して使用しますComInterfaceType.InterfaceIsUnknown

于 2011-06-23T12:01:09.663 に答える