爲什麼Visual Studio有時會將COM庫中的SAME指針參數變爲uint
,有時會變成ulong
?我有了一些方法與參數,如互操作程序集指針長度
當我引用我的臺式電腦上的這個庫,互操作程序集變成了ULONG_PTR
到uint
一個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生成。
是的,它肯定聽起來不同的是來自32位和64位版本。現在我已經想出如何確認這一點,稍微更新了原文。仍然不知道爲什麼差異。 – 2009-12-06 12:58:39
哦,我認爲(U)IntPtr在任何情況下都是正確的。這些參數大多是窗口句柄,並且至少WinForms控件將Handle屬性顯示爲IntPtr。現在我只需要弄清楚如何告訴tlbimp。 – 2009-12-06 13:23:18
COM是一個二進制標準。 COM接口不能在32位和64位之間浮動,具體取決於使用哪個.NET框架來執行它,但.NET代碼將會。如果您的可執行文件被固定爲一個或另一個(即不是AnyCPU),則只應使用U/IntPtr。 – 2009-12-06 16:36:48