.NET 技術(shù)已經(jīng)成為微軟平臺的主流,但是在Win32時代開發(fā)了很多COM、DCOM組件,由于在開發(fā)COM組件時投入了大量的人力、財力,如何在.NET環(huán)境下重用這些COM組件就顯得更有意義。
.NET支持運行時通過COM、COM+、本地WinAPI調(diào)用與未托管代碼的雙向互操作性,要實現(xiàn)互操作性,必須首先引入.NET Framework的 System.Runtime.InteropServices命名空間。
C#的語法為:
using System.Runtime.InteropServices;
1) .NET訪問API
.NET允許C#訪問未托管的DLL的函數(shù)。如要調(diào)用Windows User32.dll的MessageBox函數(shù):
int MessageBox(HWND hwnd,LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)
可以聲明一個具有DLLImport屬性的static extern方法:
using System.Runtime.InteropServices;
[DllImport(“user32.dll”)]
static ertern int MessageBox(int hwnd,string text,string caption,int type);
然后在代碼里面直接調(diào)用就可以了。這里要注意在調(diào)用返回字符串的API中使用StringBuilder對象。
2) .NET訪問COM組件
從.NET調(diào)用COM組件比較容易,只要使用tlbimp.exe產(chǎn)生COM的裝配形式的WarpClass,然后在.NET項目中調(diào)用即可。
注意COM的類型信息通過Type Library文件描述,.NET裝配件是自描述的。Tlbimp的作用是從COM組件及其類型信息中產(chǎn)生自描述的裝配件。
1.編寫Com組件
編譯生成一個ComAccount.dll。
2. 產(chǎn)生.NET可訪問的包裝類(assembly),使用TlbImp.exe產(chǎn)生.NET裝配件。
TlbImp /out:NetAccount.dll ComAccount.dll
3.在.NET代碼中訪問
.NET代碼只需引用NetAccount.dll,就可以像訪問.NET的裝配件一樣訪問COM組件。