僅能存取 C 風格 Win32 函式,手寫介面宣告開銷大,非高產做法。
以 /clr 編譯原生 C++ 程式碼產生 MSIL 庫,但資料仍在原生堆,無法直接被 C# 呼叫。需建立受控包裝類別:
public __gc class ManagedWrapper : IDisposable
{
private: NativeType* _pMyClass;
public: ManagedWrapper() : _pMyClass(new NativeType()) { }
virtual void Dispose() { delete _pMyClass; _pMyClass = NULL; GC::SuppressFinalize(this); }
~ManagedWrapper() { delete _pMyClass; }
__property String* get_Name() { return _pMyClass->Name(); }
__property void set_Name(String* value) { /* 字串轉換與複製 */ }
void DOStuff() { _pMyClass->DOStuff(); }
}
/clr 程式碼使用原生堆,CLR 無法驗證安全性,呼叫端需 SecurityPermission 執行非受信程式碼。但對於非 COM 的現有 C++ 程式碼,/clr 仍是最佳策略:無 thunking 開銷,原生 CPU 指令效能最佳。
/clr + 受控 C++ 包裝。互操作痛苦,認真評估是否必要。