2015-10-08 93 views
2

在C#中我聲明瞭一個接口,它將暴露給COM供C++使用。我們的規範說一個整數參數應該是[in]UINT uiVal。我在C#中使用了int,它被暴露爲long什麼.NET類型編組到COM UINT?

這不是什麼大不了的事,但我怎麼能強制馬歇爾UINT而非long?某些特定的.Net類型,還是我需要以某種方式向C#參數添加屬性?

回答

3

UINT是來自Windows SDK的類型別名,您永遠不會從類型庫中獲取它。翻譯類型庫的工具,如您正在使用的#import指令,選擇本地C類型。歷史扮演着角色,COM最初是爲16位版本的Windows設計的。當對聲明一個32位整數很重要。

C#聲明中最接近的是uint,它將在您的C++代碼中被轉換爲unsigned long。這很好,它仍然是一個32位的類型,微軟選擇了LLP64 data model作爲64位代碼。他們沒有太多的選擇。與在* nix中選擇的LP64模型不同。他們沒有太多的選擇,Y2K38災難即將來臨:)