C++ 函式回傳 IWConfrence* 等介面指標,VB.NET 無法直接以 Managed 方式接收。強行用 IntPtr 接收後仍需手動管理生命週期,極易造成記憶體洩漏、存取違規。
graph LR
VB[VB.NET App] -->|Managed Call| CLI[C++/CLI Wrapper]
CLI -->|Native Call| CPP[Native C++ DLL]
CPP -->|Return Pointer| CLI
CLI -->|Wrap as Managed Class| VB
.dll),參考原生 DLL。IntPtr 或原生指標,實作 IDisposable 釋放資源。// Wrapper.h (C++/CLI)
public ref class ConferenceWrapper : IDisposable {
IWConfrence* _ptr;
public:
ConferenceWrapper(int componentSet) {
_ptr = Com_CreateConfrence(componentSet);
if (!_ptr) throw gcnew System::Exception("Create failed");
}
~ConferenceWrapper() { this->!ConferenceWrapper(); }
!ConferenceWrapper() { if (_ptr) { _ptr->Release(); _ptr = nullptr; } }
// 代理原生方法
void Start() { _ptr->Start(); }
};
// VB.NET 使用
Dim conf As New ConferenceWrapper(0x001L Or 0x002L)
conf.Start()
conf.Dispose() ' 或 Using 區塊
| 方案 | 優點 | 缺點 |
|---|---|---|
| C++/CLI 包裝 | 型別安全、GC 友善、IDE 支援完整 | 需維護混合模式專案、僅限 Windows |
| P/Invoke + IntPtr | 無額外專案 | 手動記憶體管理、易出錯、除錯困難 |
| COM 介面 | 跨語言標準 | 需註冊、版本控管複雜 |
結論: 投資建立 C++/CLI 橋接層,長期維護成本最低、最安全。