0

我试图将用 C# 编写的本地服务器公开给非托管代码以允许互操作!托管代码如下所示:


    [Guid("A0D470AF-0618-40E9-8297-8C63BAF3F1C3")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IMyLocalInterface
    {
        void LogToServer(string message);
    }

    [Guid("9E9E5403-7993-49ED-BAFA-FD9A63A837E3")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class MyLocalClass : IMyLocalInterface
    {
        public MyLocalClass()
        {
            Console.WriteLine("Object created!");
        }

        public void LogToServer(string message)
        {
            Console.WriteLine("Log > " + message);
        }
    }

    class Program
    {
        [MTAThread]
        static void Main(string[] args)
        {
            var srv = new RegistrationServices();
            var cookie = srv.RegisterTypeForComClients(typeof(MyLocalClass), RegistrationClassContext.LocalServer | RegistrationClassContext.RemoteServer, RegistrationConnectionType.MultipleUse);

            Console.ReadLine();

            srv.UnregisterTypeForComClients(cookie);
        }
    }

我的非托管代码执行以下操作:


#import "ManagedLocServer.tlb" no_namespace raw_interfaces_only

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    {
        IMyLocalInterfacePtr ptr;
        ptr.CreateInstance(__uuidof(MyLocalClass));

        ptr->LogToServer(L"Initializing...");

    }
    CoUninitialize();
    return 0;
}

调试后我看到 CoCreateInstance 没有任何问题,这意味着“创建的对象”被打印到托管服务器控制台中。但随后该对象上的 QueryInterface 因 E_NOINTERFACE 而失败。我有点困惑为什么会发生这种情况。注册是否有问题(我的 CLSID 只有一个 LocalServer32 条目)?这是我的托管代码中的问题吗?如果有人能给我一个提示会很好:)

问候乔

4

1 回答 1

2

您正在使用进程外 COM。这需要编组支持,使方法调用需要序列化方法的参数。这通常是通过从 .idl 文件中的 midl.exe 生成的代码构建代理/存根 DLL 来完成的。或者通过使用与类型库一起使用的标准编组器。两者都需要 HKCR\Interface 中的注册表项

你得到 E_NOINTERFACE 因为 COM 找不到编组器。如果你有一个 .idl 文件但你没有,这很容易解决,服务器是在 .NET 中实现的。不知道如何解决这个问题,我从来没有尝试过这个工作。一个遥远的可能性是 CLR 互操作层提供编组支持。但是您肯定至少必须使用 ComInterfaceType.InterfaceIsDual。这只是一个猜测。如果我试图完成这项工作,我会先从 .idl 开始。

于 2011-02-02T14:03:34.970 回答