如何在C#里调用COM的函数并取得返回值
本人对COM一窍不通。客户提供了用COM写的dll,包括x.dll和xLib.dll(x代表dll的名称,以Lib结束的这个dll是不是相当于Type library?)。 现在需要调用其中的一个函数,把xLib.dll加到Solution下的References里后,可以在object browser里看到函数签名,但该函数的返回值为void,而com的函数返回值都是hresult类型,。我怎么才能取得这个COM函数的返回值?
如能赐教,不胜感激!
[解决办法]
如果你非要这样做,那么手工写一个封装。用[PreserveSig]来声明不要把HRESULT吃掉。
你可以参考以下代码,记得要换掉Interface和coclass的GUID。
- C# code
using System;using System.Runtime.InteropServices;using System.Runtime.CompilerServices;[ComImport][Guid("A4E23A7E-C932-4A31-8455-2F137015DCB2")]public interface INakeTTClass{ [DispId(1)] int Add(int a, int b, out int c); [DispId(2)] int GetAge();} [ComImport][Guid("73269D6A-0BB4-46B8-8062-7C8DCDEE81D3")]public class NakeTTClass : INakeTTClass{ [DispId(1)] [PreserveSig] //<--------------- [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] public extern int Add(int a, int b, out int c); [DispId(2)] [PreserveSig] //<--------------- [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] public extern int GetAge();}class Program{ static void Main() { NakeTTClass nake = new NakeTTClass(); int sum; int hresult = nake.Add(3, 4, out sum); // hresult == S_OK == 0 // sum == 7 hresult = nake.GetAge(); // hresult = 123 }}