MFC调用remoting的问题。
目前情况是这样的。使用vc.net2005做了一个MFC动态链接库a.dll这个动态库编译选项打开了clr,支持托管代码调用。
在a.dll中调用了.net中remoting的方法,并注册了remoting远程对象,作为remoting的服务端。
由于a.dll是要用来替换以前老版本的库的,调用a.dll的上层应用程序是用MFC写的程序并且保持不变;
a.dll的导出函数与类接口必须保证与旧版本库中导出函数与类接口相同,只是内部功能改用.net remoting来实现,所以a.dll是一个混合dll。
现在出现了以下问题:
在a.dll与被调用它的应用程序(SERVER)在同一目录时,没有问题,客户端程序(CLIENT)(客户端程序是一个纯clr工程)可以取得远程对象,并调用其中的方法。
但是,客户的要求是要把a.dll放到一个指定的目录e:\dll中,这样就出问题了,由于a.dll是一个mfc动态库,所以为了应用程序可以找到调用它的路径,在环境变量path中加入了对e:\dll的指定。
调用a.dll的 SERVER 程序可以调用a.dll没问题,
客户端程序CLIETN 取得远程对象的代理
oRemoteObject = (COCommRemoteObj^)Activator::GetObject(COCommRemoteObj::typeid,strURI);
执行完上面这句也没出异常。
但是在执行oRemoteObject中的任何方法时,跳出异常:
'a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
[System::IO::FileNotFoundException^]
0x03cbee14 { _fileName="a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" _fusionLog="
DisplayName = a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
HResult 0x80070002 int
Server stack trace:
System.Reflection.Assembly nLoad(System.Reflection.AssemblyName, System.String, System.Security.Policy.Evidence, System.Reflection.Assembly, System.Threading.StackCrawlMark ByRef, Boolean, Boolean)
从出错信息可以看出,应该是System.Reflection.Assembly nLoad出了异常,未找到指定的dll。
原因应该是在客户端程序中用Assembly nLoad()方法去调用a.dll,
但是a.dll是一个mfc动态库,其中并没有.net动态库中的Assembly 信息而导致出错。
经过以上分析,把a.dll中的remoting远程对象代码从a.dll中分离出来,单独做成一个纯clr动态库RemoteObj.dll上问题就可以解决以了。
但是以上解决方法客户不接受,必须得保证remoting远程对象的代码包含在a.dll中,不从其中分离出来,并且还不能与调用它的应用程序在同一目录,有无高手帮我解决这个问题,还是clr与mfc混编的动态库无法达到上述要求。微软有无对这种现象的明确说法。
--------------------编程问答-------------------- a.dll 中的remoting对象实现一个接口,单把这个接口提取为一个dll,部署到客户端
--------------------编程问答-------------------- 提取接口的方法对我来说,和把remoting提出来单做一个dll一样。
主要是客户那边不让再产生新的dll了,要就就让先有的dll达到他们这样的要求。 --------------------编程问答-------------------- 有个方法,你做出来的两个都是managed assembly, 可以使用一个Assembly Merge的工具,合并两个Assembly.
补充:.NET技术 , VC.NET