我想在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为的组件的COM类工厂{7B9F9A71-8E1B-3470-8A79-EB4DA9B25A4}由于以下错误:80040154类未注册(HRESULT中的异常:0x80040154(REGDB_E_CLASSNOTREG))。
如何解决问题?我需要在x64应用程序中使用我的x86 dll!
您收到"class not registered"错误,因为您使用了错误版本的Regasm.exe来注册类库。或者因为您让VS注册它。您必须使用Regasm的64位版本,它位于c:\windows\microsoft.net\framework64子目录中。
然而,这并不能解决您的真正问题,COM只能为进程外的COM服务器弥合比特差距。NET不直接支持创建它们,只有进程内服务器才容易。这就是你所得到的,它仍然会失败,因为进程中的服务器必须与EXE的位匹配。
在.NET中获取进程外的COM服务器需要使用COM+并从ServicedComponent类派生。这里有一篇介绍分步操作的文章。
坦率地说,你这样做并不领先。使用.NET Remoting或WCF允许64位进程与加载32位组件的32位主机进程进行对话,这样做会更好。