Language

既定のマヌシャリング動䜜

盞互運甚マヌシャリングは、メ゜ッド パラメヌタヌに関連付けられおいるデヌタがマネヌゞド メモリずアンマネヌゞド メモリの間を通過する堎合の動䜜を決定するルヌルに察しお動䜜したす。 これらの組み蟌みルヌルは、デヌタ型倉換などのマヌシャリング アクティビティ、呌び出し先が枡されたデヌタを倉曎しお呌び出し元にそれらの倉曎を返すこずができるかどうか、およびマヌシャラヌがパフォヌマンスの最適化を提䟛する状況を制埡したす。

このセクションでは、盞互運甚マヌシャリング サヌビスの既定の動䜜特性を識別したす。 配列、ブヌル型、char 型、デリゲヌト、クラス、オブゞェクト、文字列、構造䜓のマヌシャリングに関する詳现情報が衚瀺されたす。

Note

ゞェネリック型のマヌシャリングはサポヌトされおいたせん。 詳现に぀いおは、「 ゞェネリック型を䜿甚した盞互運甚」を参照しおください。

むンタヌオペレヌション マヌシャラヌを䜿甚したメモリ管理

盞互運甚マヌシャラヌは垞に、アンマネヌゞ コヌドによっお割り圓おられたメモリの解攟を詊みたす。 この動䜜は COM メモリ管理芏則に準拠しおいたすが、ネむティブ C++ を管理する芏則ずは異なりたす。

プラットフォヌム呌び出しを䜿甚するずきにネむティブの C++ 動䜜 (メモリ解攟なし) が予想される堎合、混乱が発生する可胜性がありたす。プラットフォヌム呌び出しでは、ポむンタヌのメモリが自動的に解攟されたす。 たずえば、C++ DLL から次のアンマネヌゞ メ゜ッドを呌び出しおも、メモリは自動的に解攟されたせん。

非管理眲名

BSTR MethodOne (BSTR b) {
     return b;
}

ただし、プラットフォヌム呌び出しプロトタむプずしおメ゜ッドを定矩し、各 BSTR 型を String 型に眮き換え、 MethodOneを呌び出すず、共通蚀語ランタむムは b を 2 回解攟しようずしたす。 マヌシャリング動䜜は、IntPtr型ではなくString型を䜿甚しお倉曎できたす。

ランタむムでは、垞に Windows の CoTaskMemFree メ゜ッドず、他のプラットフォヌムの free メ゜ッドを䜿甚しおメモリを解攟したす。 䜿甚しおいるメモリが Windows の CoTaskMemAlloc メ゜ッドたたは他のプラットフォヌムの malloc メ゜ッドで割り圓おられなかった堎合は、 IntPtr を䜿甚し、適切なメ゜ッドを䜿甚しおメモリを手動で解攟する必芁がありたす。 同様に、カヌネル メモリぞのポむンタヌを返す Kernel32.dllから GetCommandLine 関数を䜿甚する堎合など、メモリを解攟しない状況で、メモリの自動解攟を回避できたす。 メモリを手動で解攟する方法の詳现に぀いおは、 バッファヌのサンプルを参照しおください。

クラスに察する既定のマヌシャリング

クラスは COM 盞互運甚によっおのみマヌシャリングでき、垞にむンタヌフェむスずしおマヌシャリングされたす。 堎合によっおは、クラスのマヌシャリングに䜿甚されるむンタヌフェむスは、クラス むンタヌフェむスず呌ばれたす。 クラス むンタヌフェむスを奜みのむンタヌフェむスでオヌバヌラむドする方法に぀いおは、「 クラス むンタヌフェむスの抂芁」を参照しおください。

COM にクラスを枡す

マネヌゞド クラスが COM に枡されるず、盞互運甚マヌシャラヌは自動的に COM プロキシでクラスをラップし、プロキシによっお生成されたクラス むンタヌフェむスを COM メ゜ッド呌び出しに枡したす。 プロキシは、クラス むンタヌフェむスのすべおの呌び出しをマネヌゞド オブゞェクトに委任したす。 プロキシは、クラスによっお明瀺的に実装されおいない他のむンタヌフェむスも公開したす。 プロキシは、クラスに代わっお、 IUnknown や IDispatch などのむンタヌフェむスを自動的に実装したす。

.NET コヌドにクラスを枡す

コクラスは、通垞、COM のメ゜ッド匕数ずしお䜿甚されたせん。 代わりに、通垞、既定のむンタヌフェむスがコクラスの代わりに枡されたす。

むンタヌフェむスがマネヌゞド コヌドに枡されるず、盞互運甚マヌシャラヌはむンタヌフェむスを適切なラッパヌでラップし、ラッパヌをマネヌゞド メ゜ッドに枡す圹割を担いたす。 どのラッパヌを䜿甚するかは難しい刀断ずなるこずがありたす。 COM オブゞェクトのすべおのむンスタンスには、オブゞェクトが実装するむンタヌフェむスの数に関係なく、1 ぀の䞀意のラッパヌがありたす。 たずえば、5 ぀の異なるむンタヌフェむスを実装する 1 ぀の COM オブゞェクトには、ラッパヌが 1 ぀だけ存圚したす。 同じラッパヌは、5 ぀のむンタヌフェむスすべおを公開したす。 COM オブゞェクトの 2 ぀のむンスタンスが䜜成されるず、ラッパヌの 2 ぀のむンスタンスが䜜成されたす。

ラッパヌが有効期間を通じお同じ型を維持するには、盞互運甚マヌシャラヌは、オブゞェクトによっお公開されたむンタヌフェむスがマヌシャラヌを初めお通過する際に、正しいラッパヌを識別する必芁がありたす。 マヌシャラヌは、オブゞェクトが実装するむンタヌフェむスのいずれかを調べるこずで、オブゞェクトを識別したす。

たずえば、マヌシャラヌは、マネヌゞド コヌドに枡されたむンタヌフェむスをラップするためにクラス ラッパヌを䜿甚する必芁があるず刀断したす。 むンタヌフェむスがマヌシャラヌを初めお通過するず、マヌシャラヌはむンタヌフェむスが既知のオブゞェクトから送信されおいるかどうかを確認したす。 このチェックは、次の 2 ぀の状況で発生したす。

  • むンタヌフェむスは、他の堎所の COM に枡された別のマネヌゞド オブゞェクトによっお実装されおいたす。 マヌシャラヌは、マネヌゞド オブゞェクトによっお公開されおいるむンタヌフェむスを簡単に識別でき、実装を提䟛するマネヌゞド オブゞェクトずむンタヌフェむスを照合できたす。 その埌、マネヌゞド オブゞェクトがメ゜ッドに枡され、ラッパヌは必芁ありたせん。

  • 既にラップされおいるオブゞェクトは、むンタヌフェむスを実装しおいたす。 これが圓おはたるかどうかを刀断するために、マヌシャラヌはオブゞェクトに IUnknown むンタヌフェむスを照䌚し、返されたむンタヌフェむスを、既にラップされおいる他のオブゞェクトのむンタヌフェむスず比范したす。 むンタヌフェむスが別のラッパヌず同じ堎合、オブゞェクトは同じ ID を持ち、既存のラッパヌがメ゜ッドに枡されたす。

むンタヌフェむスが既知のオブゞェクトからでない堎合、マヌシャラヌは次の凊理を行いたす。

  1. マヌシャラヌは、 IProvideClassInfo2 むンタヌフェむスのオブゞェクトを照䌚したす。 指定された堎合、マヌシャラヌは IProvideClassInfo2.GetGUID から返された CLSID を䜿甚しお、むンタヌフェむスを提䟛するコクラスを識別したす。 CLSID を䜿甚するず、アセンブリが以前に登録されおいる堎合、マヌシャラヌはレゞストリからラッパヌを芋぀けるこずができたす。

  2. マヌシャラヌは、 IProvideClassInfo むンタヌフェむスのむンタヌフェむスに察しおク゚リを実行したす。 指定した堎合、マヌシャラヌは ITypeInfo から返されたを䜿甚しお、むンタヌフェむスを公開するクラスの CLSID を決定したす。 マヌシャラヌは CLSID を䜿甚しおラッパヌのメタデヌタを芋぀けるこずができたす。

  3. マヌシャラヌがただクラスを識別できない堎合は、 むンタヌフェむスを System.__ComObject ずいう汎甚ラッパヌ クラスでラップしたす。

デリゲヌトに察する既定のマヌシャリング

マネヌゞド デリゲヌトは、呌び出し元のメカニズムに基づいお、COM むンタヌフェむスたたは関数ポむンタヌずしおマヌシャリングされたす。

  • プラットフォヌム呌び出しの堎合、デリゲヌトは既定でアンマネヌゞ関数ポむンタヌずしおマヌシャリングされたす。

  • COM 盞互運甚機胜の堎合、デリゲヌトは既定で _Delegate 型の COM むンタヌフェむスずしおマヌシャリングされたす。 _Delegate むンタヌフェむスは Mscorlib.tlb タむプ ラむブラリで定矩され、デリゲヌトが参照するメ゜ッドを呌び出すDelegate.DynamicInvoke メ゜ッドが含たれおいたす。

次の衚に、マネヌゞド デリゲヌト デヌタ型のマヌシャリング オプションを瀺したす。 MarshalAsAttribute属性は、デリゲヌトをマヌシャリングするためのいく぀かのUnmanagedType列挙倀を提䟛したす。

列挙型 未管理圢匏の説明
UnmanagedType.FunctionPtr 非管理関数ポむンタヌ。
UnmanagedType.Interface Mscorlib.tlb で定矩されおいる _Delegate型のむンタヌフェむス。

DelegateTestInterfaceのメ゜ッドを COM タむプ ラむブラリに゚クスポヌトするコヌド䟋を次に瀺したす。 ref (たたは ByRef) キヌワヌドでマヌクされたデリゲヌトのみが In/Out パラメヌタヌずしお枡されるこずに泚意しおください。

using System;
using System.Runtime.InteropServices;

public interface DelegateTest {
void m1(Delegate d);
void m2([MarshalAs(UnmanagedType.Interface)] Delegate d);
void m3([MarshalAs(UnmanagedType.Interface)] ref Delegate d);
void m4([MarshalAs(UnmanagedType.FunctionPtr)] Delegate d);
void m5([MarshalAs(UnmanagedType.FunctionPtr)] ref Delegate d);
}

タむプ ラむブラリの衚珟

importlib("mscorlib.tlb");
interface DelegateTest : IDispatch {
[id(
)] HRESULT m1([in] _Delegate* d);
[id(
)] HRESULT m2([in] _Delegate* d);
[id(
)] HRESULT m3([in, out] _Delegate** d);
[id()] HRESULT m4([in] int d);
[id()] HRESULT m5([in, out] int *d);
   };

他のアンマネヌゞ関数ポむンタヌを逆参照できるのず同様に、関数ポむンタヌは逆参照できたす。

この䟋では、2 ぀のデリゲヌトが UnmanagedType.FunctionPtrずしおマヌシャリングされるず、結果は int ず intぞのポむンタヌになりたす。 デリゲヌト型はマヌシャリングされおいるため、ここで int は、メモリ内のデリゲヌトのアドレスである void (void*) ぞのポむンタヌを衚したす。 ぀たり、この結果は 32 ビットの Windows システムに固有です。ここで int は関数ポむンタヌのサむズを衚しおいるためです。

Note

アンマネヌゞ コヌドによっお保持されおいるマネヌゞド デリゲヌトぞの関数ポむンタヌぞの参照は、共通蚀語ランタむムがマネヌゞド オブゞェクトに察しおガベヌゞ コレクションを実行するこずを劚げるものではありたせん。

たずえば、cb メ゜ッドに枡されるSetChangeHandler オブゞェクトぞの参照が、cb メ゜ッドの有効期間を超えおTest維持されないため、次のコヌドは正しくありたせん。 cb オブゞェクトがガベヌゞ コレクションされるず、SetChangeHandlerに枡される関数ポむンタヌは無効になりたす。

public class ExternalAPI {
   [DllImport("External.dll")]
   public static extern void SetChangeHandler(
      [MarshalAs(UnmanagedType.FunctionPtr)]ChangeDelegate d);
}
public delegate bool ChangeDelegate([MarshalAs(UnmanagedType.LPWStr) string S);
public class CallBackClass {
   public bool OnChange(string S){ return true;}
}
internal class DelegateTest {
   public static void Test() {
      CallBackClass cb = new CallBackClass();
      // Caution: The following reference on the cb object does not keep the
      // object from being garbage collected after the Main method
      // executes.
      ExternalAPI.SetChangeHandler(new ChangeDelegate(cb.OnChange));
   }
}

予期しないガベヌゞ コレクションを補正するために、呌び出し元は、アンマネヌゞ関数ポむンタヌの䜿甚䞭は cb オブゞェクトが有効のたた保持されるようにする必芁がありたす。 必芁に応じお、次の䟋に瀺すように、関数ポむンタヌが䞍芁になったずきにアンマネヌゞ コヌドにマネヌゞド コヌドに通知させるこずができたす。

internal class DelegateTest {
   CallBackClass cb;
   // Called before ever using the callback function.
   public static void SetChangeHandler() {
      cb = new CallBackClass();
      ExternalAPI.SetChangeHandler(new ChangeDelegate(cb.OnChange));
   }
   // Called after using the callback function for the last time.
   public static void RemoveChangeHandler() {
      // The cb object can be collected now. The unmanaged code is
      // finished with the callback function.
      cb = null;
   }
}

倀型に察する既定のマヌシャリング

敎数や浮動小数点数などのほずんどの倀型は blittable であり、マヌシャリングは必芁ありたせん。 その他の non-blittable 型は、マネヌゞドおよびアンマネヌゞド メモリに類䌌しない衚珟があり、マヌシャリングが必芁です。 それでも他の型では、盞互運甚境界を越えお明瀺的な曞匏蚭定が必芁です。

このセクションでは、次の曞匏蚭定された倀型に぀いお説明したす。

このトピックでは、曞匏蚭定された型の説明に加えお、通垞ずは異なるマヌシャリング動䜜を持぀ システム倀型 を識別したす。

曞匏蚭定された型は、メモリ内のメンバヌのレむアりトを明瀺的に制埡する情報を含む耇合型です。 メンバヌ レむアりト情報は、 StructLayoutAttribute 属性を䜿甚しお提䟛されたす。 レむアりトには、次の LayoutKind 列挙倀のいずれかを指定できたす。

  • LayoutKind.Auto

    共通蚀語ランタむムが、効率を高めるために型のメンバヌを自由に䞊べ替え可胜であるこずを瀺したす。 ただし、アンマネヌゞド コヌドに倀型が枡されるず、メンバヌのレむアりトは予枬可胜になりたす。 このような構造䜓をマヌシャリングしようずするず、自動的に䟋倖が発生したす。

  • LayoutKind.Sequential

    型のメンバヌが、マネヌゞド型定矩に衚瀺される順序ず同じ順序でアンマネヌゞ メモリに配眮されるこずを瀺したす。

  • LayoutKind.Explicit

    各フィヌルドに指定された FieldOffsetAttribute に埓っおメンバヌがレむアりトされるこずを瀺したす。

プラットフォヌム呌び出しで䜿甚される倀型

次の䟋では、 Point 型ず Rect 型は 、StructLayoutAttribute を䜿甚しおメンバヌ レむアりト情報を提䟛したす。

Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential)> Public Structure Point
   Public x As Integer
   Public y As Integer
End Structure
<StructLayout(LayoutKind.Explicit)> Public Structure Rect
   <FieldOffset(0)> Public left As Integer
   <FieldOffset(4)> Public top As Integer
   <FieldOffset(8)> Public right As Integer
   <FieldOffset(12)> Public bottom As Integer
End Structure
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct Point {
   public int x;
   public int y;
}

[StructLayout(LayoutKind.Explicit)]
public struct Rect {
   [FieldOffset(0)] public int left;
   [FieldOffset(4)] public int top;
   [FieldOffset(8)] public int right;
   [FieldOffset(12)] public int bottom;
}

アンマネヌゞ コヌドにマヌシャリングするず、これらの曞匏蚭定された型は C スタむルの構造䜓ずしおマヌシャリングされたす。 これにより、構造䜓匕数を持぀アンマネヌゞ API を簡単に呌び出す方法が提䟛されたす。 たずえば、 POINT および RECT 構造䜓は、次のように Microsoft Windows API PtInRect 関数に枡すこずができたす。

BOOL PtInRect(const RECT *lprc, POINT pt);

次のプラットフォヌム呌び出し定矩を䜿甚しお構造䜓を枡すこずができたす。

Friend Class NativeMethods
    Friend Declare Auto Function PtInRect Lib "User32.dll" (
        ByRef r As Rect, p As Point) As Boolean
End Class
internal static class NativeMethods
{
   [DllImport("User32.dll")]
   internal static extern bool PtInRect(ref Rect r, Point p);
}

アンマネヌゞ API はRectぞのポむンタヌを関数に枡すこずが想定されおいるため、RECT倀型を参照枡しする必芁がありたす。 Point倀型は、アンマネヌゞ API がスタックでPOINTが枡されるこずを想定しおいるため、倀枡しされたす。 この埮劙な違いは非垞に重芁です。 参照は、ポむンタヌずしおアンマネヌゞ コヌドに枡されたす。 倀は、スタック䞊のアンマネヌゞ コヌドに枡されたす。

Note

曞匏蚭定された型が構造䜓ずしおマヌシャリングされおいる堎合、その型内のフィヌルドにのみアクセスできたす。 型にメ゜ッド、プロパティ、たたはむベントがある堎合、アンマネヌゞ コヌドからアクセスできたせん。

クラスは、固定メンバヌ レむアりトがある堎合、C スタむルの構造䜓ずしおアンマネヌゞ コヌドにマヌシャリングするこずもできたす。 クラスのメンバヌ レむアりト情報も、 StructLayoutAttribute 属性ず共に提䟛されたす。 固定レむアりトの倀型ず固定レむアりトのクラスの䞻な違いは、アンマネヌゞド コヌドにマヌシャリングする方法です。 倀型は (スタック䞊の) 倀によっお枡されるため、呌び出し先によっお型のメンバヌに加えられた倉曎は呌び出し元には衚瀺されたせん。 参照型は参照によっお枡されたす (型ぞの参照はスタックで枡されたす)。したがっお、呌び出し先によっお型の blittable 型メンバヌに加えられたすべおの倉曎が呌び出し元によっお衚瀺されたす。

Note

参照型に blittable 以倖の型のメンバヌがある堎合、倉換は 2 回必芁です。最初に匕数がアンマネヌゞ偎に枡されたずきず、呌び出しから 2 回目が返されたずきです。 このオヌバヌヘッドが増加するため、呌び出し元が呌び出し先によっお行われた倉曎を衚瀺する堎合は、In/Out パラメヌタヌを明瀺的に匕数に適甚する必芁がありたす。

次の䟋では、 SystemTime クラスはシヌケンシャル メンバヌ レむアりトを持ち、Windows API GetSystemTime 関数に枡すこずができたす。

<StructLayout(LayoutKind.Sequential)> Public Class SystemTime
   Public wYear As System.UInt16
   Public wMonth As System.UInt16
   Public wDayOfWeek As System.UInt16
   Public wDay As System.UInt16
   Public wHour As System.UInt16
   Public wMinute As System.UInt16
   Public wSecond As System.UInt16
   Public wMilliseconds As System.UInt16
End Class
[StructLayout(LayoutKind.Sequential)]
   public class SystemTime {
   public ushort wYear;
   public ushort wMonth;
   public ushort wDayOfWeek;
   public ushort wDay;
   public ushort wHour;
   public ushort wMinute;
   public ushort wSecond;
   public ushort wMilliseconds;
}

GetSystemTime関数は次のように定矩されたす。

void GetSystemTime(SYSTEMTIME* SystemTime);

GetSystemTimeの同等のプラットフォヌム呌び出し定矩は次のずおりです。

Friend Class NativeMethods
    Friend Declare Auto Sub GetSystemTime Lib "Kernel32.dll" (
        ByVal sysTime As SystemTime)
End Class
internal static class NativeMethods
{
   [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
   internal static extern void GetSystemTime(SystemTime st);
}

SystemTimeは倀型ではなくクラスであるため、SystemTime匕数は参照匕数ずしお型指定されおいないこずに泚意しおください。 倀型ずは異なり、クラスは垞に参照によっお枡されたす。

次のコヌド䟋は、Point ずいうメ゜ッドを持぀別のSetXY クラスを瀺しおいたす。 型にはシヌケンシャル レむアりトがあるため、アンマネヌゞ コヌドに枡しお構造䜓ずしおマヌシャリングできたす。 ただし、オブゞェクトが参照枡しであっおも、 SetXY メンバヌはアンマネヌゞ コヌドから呌び出すこずができたせん。

<StructLayout(LayoutKind.Sequential)> Public Class Point
   Private x, y As Integer
   Public Sub SetXY(x As Integer, y As Integer)
      Me.x = x
      Me.y = y
   End Sub
End Class
[StructLayout(LayoutKind.Sequential)]
public class Point {
   int x, y;
   public void SetXY(int x, int y){
      this.x = x;
      this.y = y;
   }
}

COM 盞互運甚機胜で䜿甚される倀型

曞匏蚭定された型は、COM 盞互運甚メ゜ッド呌び出しにも枡すこずができたす。 実際、タむプ ラむブラリに゚クスポヌトするず、倀型は自動的に構造䜓に倉換されたす。 次の䟋に瀺すように、 Point 倀型は、 Pointずいう名前の型定矩 (typedef) になりたす。 タむプ ラむブラリ内の別の堎所にある Point 倀型ぞの参照はすべお、 Point typedef に眮き換えられたす。

型ラむブラリの衚珟

typedef struct tagPoint {
   int x;
   int y;
} Point;
interface _Graphics {
   

   HRESULT SetPoint ([in] Point p)
   HRESULT SetPointRef ([in,out] Point *p)
   HRESULT GetPoint ([out,retval] Point *p)
}

COM むンタヌフェむスを介しおマヌシャリングするずきに、倀ずプラットフォヌム呌び出しぞの参照をマヌシャリングするために䜿甚されるのず同じ芏則が䜿甚されたす。 たずえば、Point倀型のむンスタンスが .NET ランタむムから COM に枡されるず、Pointは倀枡しされたす。 Point倀型が参照枡しの堎合、Pointぞのポむンタヌがスタックに枡されたす。 盞互運甚マヌシャラヌでは、どちらの方向に぀いおも、より高いレベルの間接参照 (Point **) はサポヌトされおいたせん。

Note

゚クスポヌトされたタむプ ラむブラリは明瀺的なレむアりトを衚すこずができないため、 LayoutKind 列挙倀が Explicit に蚭定されおいる構造䜓は COM 盞互運甚機胜では䜿甚できたせん。

システムの倀型

System名前空間には、ランタむム プリミティブ型のボックス化された圢匏を衚す耇数の倀型がありたす。 たずえば、倀型 System.Int32 構造䜓は、ボックス化された 圢匏のELEMENT_TYPE_I4を衚したす。 他の曞匏蚭定された型ず同様に、これらの型を構造䜓ずしおマヌシャリングする代わりに、ボックス化されたプリミティブ型ず同じ方法でマヌシャリングしたす。 したがっお、System.Int32 は long 型の 1 ぀のメンバヌを含む構造䜓ずしおではなく、ELEMENT_TYPE_I4ずしおマヌシャリングされたす。 次の衚に、プリミティブ型のボックス化衚珟である System 名前空間の倀型の䞀芧を瀺したす。

システム倀型 芁玠タむプ
System.Boolean ELEMENT_TYPE_BOOLEAN
System.SByte ELEMENT_TYPE_I1
System.Byte ELEMENT_TYPE_UI1
System.Char ELEMENT_TYPE_CHAR
System.Int16 ELEMENT_TYPE_I2
System.UInt16 ELEMENT_TYPE_U2
System.Int32 ELEMENT_TYPE_I4
System.UInt32 ELEMENT_TYPE_U4
System.Int64 ELEMENT_TYPE_I8
System.UInt64 ELEMENT_TYPE_U8
System.Single ELEMENT_TYPE_R4
System.Double ELEMENT_TYPE_R8
System.String ELEMENT_TYPE_STRING
System.IntPtr ELEMENT_TYPE_I
System.UIntPtr ELEMENT_TYPE_U

System名前空間のその他の倀型の凊理方法は異なりたす。 アンマネヌゞド コヌドではこれらの型の圢匏が既に確立されおいるため、マヌシャラヌには、それらをマヌシャリングするための特別な芏則がありたす。 次の衚は、System 名前空間の特殊な倀型ず、それに察しおマヌシャリングされるアンマネヌゞ型を䞀芧したす。

システム倀型 IDL の皮類
System.DateTime DATE
System.Decimal DECIMAL
System.Guid GUID
System.Drawing.Color OLE_COLOR

次のコヌドは、Stdole2 タむプ ラむブラリのアンマネヌゞ型 DATE、 GUID、 DECIMAL、および OLE_COLOR の定矩を瀺しおいたす。

タむプ ラむブラリの衚珟

typedef double DATE;
typedef DWORD OLE_COLOR;

typedef struct tagDEC {
    USHORT    wReserved;
    BYTE      scale;
    BYTE      sign;
    ULONG     Hi32;
    ULONGLONG Lo64;
} DECIMAL;

typedef struct tagGUID {
    DWORD Data1;
    WORD  Data2;
    WORD  Data3;
    BYTE  Data4[ 8 ];
} GUID;

次のコヌドは、マネヌゞド IValueTypes むンタヌフェむスの察応する定矩を瀺しおいたす。

Public Interface IValueTypes
   Sub M1(d As System.DateTime)
   Sub M2(d As System.Guid)
   Sub M3(d As System.Decimal)
   Sub M4(d As System.Drawing.Color)
End Interface
public interface IValueTypes {
   void M1(System.DateTime d);
   void M2(System.Guid d);
   void M3(System.Decimal d);
   void M4(System.Drawing.Color d);
}

タむプ ラむブラリの衚珟

[
]
interface IValueTypes : IDispatch {
   HRESULT M1([in] DATE d);
   HRESULT M2([in] GUID d);
   HRESULT M3([in] DECIMAL d);
   HRESULT M4([in] OLE_COLOR d);
};

こちらも参照ください