日期:2014-05-18  浏览次数:20887 次

如何在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
    }
}