C# COM互操作工作异常
我正在使用C#为黑盒本机Win32应用程序编写扩展。 在运行时,应用程序将在extesion中调用名为Register的导出函数,并向我传递一个COM对象。 然后我可以通过COM对象为应用程序做一些工作 问题是,这种方法工作起来相当奇怪。COM接口有一些方法:C# COM互操作工作异常,c#,com,interop,C#,Com,Interop,我正在使用C#为黑盒本机Win32应用程序编写扩展。 在运行时,应用程序将在extesion中调用名为Register的导出函数,并向我传递一个COM对象。 然后我可以通过COM对象为应用程序做一些工作 问题是,这种方法工作起来相当奇怪。COM接口有一些方法: [ComImport, Guid("75C46594-F6D6-4138-AC11-603C061ECC75")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public
[ComImport, Guid("75C46594-F6D6-4138-AC11-603C061ECC75")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IService
{
[return:MarshalAs(UnmanagedType.U4)]
uint GetVersion();
[return: MarshalAs(UnmanagedType.U4)]
uint GetLocale();
[return: MarshalAs(UnmanagedType.Bool)]
bool CheckVersion([In, MarshalAs(UnmanagedType.I4)]int version);
[return: MarshalAs(UnmanagedType.SysInt)]
IntPtr GetMainWindow();
}
以及主机应用程序要调用的寄存器函数:
[return: MarshalAs(UnmanagedType.Bool)]
public static bool Register([In, MarshalAs(UnmanagedType.Interface)]IService service)
{
Log("Executing Register");
try
{
Log(service.GetVersion());
}
catch (Exception e)
{
Log(e.ToString());
}
Log("Exiting Register");
return true;
}
当我在代码中调用这些方法时,它们有时会返回不期望的值(GetLocale返回0或不是区域设置ID的随机值,CheckVersion有时返回true,有时返回false等),有时甚至会使主应用程序崩溃(实际上不会崩溃,
用户界面仍在响应,但只是停止工作。)。重建代码或重新启动应用程序后,它可能会工作
所以我尝试了另一种方法。我创建了一个本机库,将该COM接口的函数作为代理公开,扩展可以通过调用本机库来操作应用程序。
它工作得很好,所以我想我在C#中的COM互操作可能存在一些问题。有人能帮我解决这个问题吗
更新:
宿主应用程序通过COM公开了几个接口,其中一些接口具有多重继承,但iSeries实际上是从IUnknown继承的,尽管它的某些方法会将其他COM对象返回给我。我不知道方法的顺序很重要。也许我可以修改C#中的定义,然后再试一次
主机应用程序的作者没有向我提供任何IDL文件,只是一个Pascal头文件:
type IService = interface(IUnknown)
['{75C46594-F6D6-4138-AC11-603C061ECC75}']
function CheckVersion(Version: Integer): BOOL;
function GetVersion: Longword;
function GetLocaleID: Longword;
//These functions return other COM objects.
function GetQueryManager: IQueryManager;
function GetLogManager: ILogManager;
//......
function GetMainWindow: HWND;
function ExecuteCommand(Cmd: Integer; Param: Pointer): BOOL;
property LocaleID: Longword read GetLocaleID;
//These are properties encapsulate some functions above.
property QueryManager: IQueryManager read GetQueryManager;
property LogManager: ILogManager read GetLogManager;
property MainWindow: HWND read GetMainWindow;
//......
end;
非常模糊,无法回答。如果IService继承自其他类型的接口(而不是IUnknown),则会出现这种问题。您必须首先声明另一个接口的方法,因为C#不支持多重继承。版本问题也是相当标准的,只是声明的内容和实际实现的内容不匹配。例如,方法的顺序是错误的。您是否有正在实现的“iSeries设备”接口的COM IDL文件?如果是这样,发布这篇文章可能有助于获得一些答案。