3

我想在我的 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 时,会出现 eroor :

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

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

4

1 回答 1

3

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

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

在 .NET 中获取进程外 COM 服务器需要使用 COM+ 并派生自 ServicedComponent 类。此处是显示分步说明的操作方法文章。

坦率地说,你这样做并没有领先。使用 .NET Remoting 或 WCF 让您的 64 位进程与加载 32 位组件的 32 位主机进程对话会更好。

于 2014-01-09T13:55:59.550 回答