1

Visual Studioアドインを作成していますが、管理対象のCodeElementsオブジェクトを管理されていない形式にマーシャリングする必要があります。ポインタをキャストして、アンマネージ側のCodeElementのように扱うことができるので、メモリ内にポインタが必要です。

    [DllImport("CodeMethodsToString.dll")]
    private static extern BSTR* CodeMethodsToString(void* functionObject);

    public static void CodeMethodsToXML(XmlElement parent, CodeElements elements)
    {
        //Call CodeMethodsToString: how do I marshall CodeElements to an IntPtr?
        //set XmlElement in here
    }

私はXMLの扱い方を知っており、C#でこれの作業バージョンを持っています。再帰の最低レベルでさまざまなメンバー変数をすべて呼び出すと、プログラムの速度が低下するため、アンマネージDLLを作成しました。System.Runtime.Interop.Marshalを使用して、CodeElementsオブジェクトをメモリ内のCOMオブジェクトへのポインターに変換する方法を知る必要があります。

ありがとう。

4

4 に答える 4

3

ジョナサンが近かったようです。これは私がそれをする方法です:

[DllImport("CodeMethodsToString.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string CodeMethodsToString(IntPtr functionObject);

public static void CodeMethodsToXML(XmlElement parent, CodeElements elements)
{
   GCHandle pin;
   try
   {
      pin = GcHandle.Alloc(elements, GCHandleType.Pinned);
      string methods = CodeMethodsToString(pin.AddrOfPinnedObject());
    }
    finally
    {
       pin.Free();
    }
}
于 2009-08-27T15:22:55.820 に答える
1

オプションで、記事の最後にある例を確認できます: GCHandle MSDN

于 2012-01-09T17:33:59.227 に答える
1

インターフェイスでありCodeElements、?ComVisibleGuidAttribute

CodeElements次に、C#がCOMオブジェクトのマーシャリングを行い、引数の型として使用できます。

[DllImport("example.dll")]
private static extern void DoStuff(CodeElements codeElements);
于 2009-08-19T23:56:35.410 に答える
1

星またはアンペアサンドが表示されたらすぐに、それをref(ポインターの安全なバージョン)に変換することから始める必要があります。過去にrefキーワードを使用したときに、参照型が魔法のように機能し始めました(これは非常に矛盾していますが、相互運用性の1つだと思います)。

[DllImport("example.dll")]
private static extern void DoStuff(ref CodeElements codeElements);

また、試すことができます:

[DllImport("example.dll")]
private static extern void DoStuff([In, Out] ref CodeElements codeElements);

または、これらの属性の順列の1つ。

試してみたいことの1つは、MFC(C ++から長い間だと思います)を使用してCOMライブラリを作成することです。ネイティブ呼び出しを使用せず、Thingをタイプライブラリとしてエクスポートし、Visual Studioで参照として追加します(はい、それはとても簡単です)。したがって、次のようなものが表示されます。

myCoolClass.DoStuff(codeElements);

固定することもできます(固定する必要がある場合、エラーは断続的に発生します)。RCWがあなたのためにそれを行うかどうかは思い出せません(私はほぼ確実です)ので、これを行うためのコードは次のとおりです。

GCHandle handle = new GCHandle();
try
{
  handle = GCHandle.Alloc(fooz, GCHandleType.Pinned);
  // Use fooz.
}
finally
{
  if (handle.IsAllocated)
    handle.Free();
}
于 2009-08-24T12:30:33.450 に答える