COM服务器C#(在x64 app中使用x86 dll)

时间:2014-01-09 13:33:24

标签: c# com-server

我想在x64 C#应用程序中使用x86 dll! 在论坛上我读到com对象会帮助我!这是我的ComServerSample。它像x86一样编译。

    [ComVisible(true)]
    public class MyComServer : IMyComSample
    {        
        private dahuaIp.fDisConnect dissconn;

        public void con(int lLoginID, StringBuilder pchDVRIP, int nDVRPort, int dwUser)
        {

        }

        public string GetString()
        {
            dissconn = new dahuaIp.fDisConnect(con);
            var zdsc = dahuaIp.CLIENT_Init(dissconn, 0);

            return zdsc.ToString();
        }
    }

    [ComVisible(true), Guid("DBE0E8C4-2222-41f3-B6A4-4E2F353D3D05")]
    public interface IMyComSample
    {
        string GetString();
    }

这是使用此com服务器的测试应用程序

Type CSI = Type.GetTypeFromProgID("ComServerSample.MyComServer");
var COMobj = Activator.CreateInstance(CSI);
MethodInfo method = CSI.GetMethod("GetString", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

var sdfc = method.Invoke(COMobj, null);

当测试应用程序是x86时!这两个应用程序工作正常! 但是,当测试应用程序是x64时,就会出现一种情绪:

  

无法获取具有CLSID的组件的COM类工厂   {7B9F9A71-8E1B-3470-8A79-EEB4DA9B25A4}由于以下错误:   80040154未注册类(HRESULT异常:0x80040154   (REGDB_E_CLASSNOTREG))。

如何解决问题?我需要在x64应用程序中使用我的x86 dll!

1 个答案:

答案 0 :(得分:3)

您收到“未注册类”错误,因为您使用了错误版本的Regasm.exe来注册类库。或者因为你让VS注册它。您必须使用64位版本的Regasm,它存在于c:\ windows \ microsoft.net \ framework64子目录中。

然而,这并不能解决您的实际问题,COM只能弥补进程外COM服务器的位差。 .NET不直接支持创建它们,只有进程内服务器很容易。这是你得到的,它仍然会失败,因为进程内服务器必须匹配EXE的位数。

在.NET中获取进程外COM服务器需要使用COM +并从ServicedComponent类派生。一篇how-to文章,展示了分步说明is here

坦率地说,你不是这样做的。使用.NET Remoting或WCF让64位进程与加载32位组件的32位主机进程通信会更好。