我想在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!
答案 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位主机进程通信会更好。