2009-12-05 97 views
0

爲什麼Visual Studio有時會將COM庫中的SAME指針參數變爲uint,有時會變成ulong?我有了一些方法與參數,如互操作程序集指針長度

​​

當我引用我的臺式電腦上的這個庫,互操作程序集變成了ULONG_PTRuint一個COM庫。當我在筆記本上做同樣的事情時,它變成了ulong。這會在機器之間共享項目時造成問題。我可能可以將Interop程序集與項目的其餘部分一起存儲在SVN中,但是如果在更新COM庫之後需要重新生成它,則會導致問題。

的系統有:

 
Desktop        Laptop 
- Windows Vista Professional 64-bit - Windows 7 Ultimate 64-bit 
- Visual Studio 2008 Professional  - Visual Studio 2008 Team System 
    (SP1)         Development Edition (SP1) 
- .Net Framework 3.5 SP1    - .Net Framework 3.5 SP1 

啓用UAC和Visual Studio中以管理員身份運行。

我會嘗試在筆記本電腦上應用Visual Studio 2008 SP1以防這種情況發生。

編輯:筆記本電腦上的應用SP1沒有效果。

更新:

當添加引用Visual Studio中的COM庫,進程監視器顯示devenv的臺式計算機上閱讀COMLibrary.dll而它在筆記本電腦讀取COMLibrary64.dll。這絕對是桌面顯示指針而筆記本電腦顯示過長的原因。

現在它爲什麼這樣做?兩臺電腦上的Devenv進程都在WoW64下運行。

運行該程序時,它根據進程監視器在兩臺計算機上使用COMLibrary64.dll。所以這個問題似乎只是在參考添加期間。

接下來將手動嘗試執行interop生成。

回答

1

它是絕對相同的COM服務器,而不是32和64位版本?您所描述的具有針對不同位的所有特徵,正如您可能知道的那樣 - ULONG_PTR在32位編譯目標中爲32位,在64位編譯目標中爲64位,但本機代碼在編譯時必須爲其中一種或另一種。

名義上的「正確」翻譯應該是UIntPtr,但是這取決於.NET客戶端進程運行的是什麼框架,而不是什麼要求,即COM服務器的位數。

+0

是的,它肯定聽起來不同的是來自32位和64位版本。現在我已經想出如何確認這一點,稍微更新了原文。仍然不知道爲什麼差異。 – 2009-12-06 12:58:39

+0

哦,我認爲(U)IntPtr在任何情況下都是正確的。這些參數大多是窗口句柄,並且至少WinForms控件將Handle屬性顯示爲IntPtr。現在我只需要弄清楚如何告訴tlbimp。 – 2009-12-06 13:23:18

+0

COM是一個二進制標準。 COM接口不能在32位和64位之間浮動,具體取決於使用哪個.NET框架來執行它,但.NET代碼將會。如果您的可執行文件被固定爲一個或另一個(即不是AnyCPU),則只應使用U/IntPtr。 – 2009-12-06 16:36:48