通过远程程序集创建对象的问题,思归请进!!

Samen168 2005-02-06 11:43:27
我在主程序里通过下面的方法创建了对象
Assembly oAssembly = Assembly.LoadFrom(assembly1_URL); //assembly1_URL是个http://..地址
Type objectType = oAssembly.GetType(func.CSTypeName);
object Object=Activator.CreateInstance(objectType);
if(Object is Form)
{
Form form = Object as Form;
form.Show();
}

然后在form里有个方法调用远程remoting服务返回一个对象 objectA ,objectA是另一个程序集assembly2里定义的,且assembly2在本地不存在,和assembly1一样是个远程地址

问题是remoting服务端方法执行完成返回对象时,客户端会报异常 “无法找到程序集 assembly2 ...”

我想出错的原因是服务器返回对象后,客户端会尝试在本地查找assembly2并反序列化产生objectA实列,可本地目录文件不存在,如果解决?!
...全文
363 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
momentmobile 2005-02-17
  • 打赏
  • 举报
回复
up
readersm68 2005-02-17
  • 打赏
  • 举报
回复
还是WebService简单
readersm68 2005-02-17
  • 打赏
  • 举报
回复
搞了半天还是下载下来解决的阿
nga96 2005-02-17
  • 打赏
  • 举报
回复
UP
Samen168 2005-02-16
  • 打赏
  • 举报
回复
呵呵,问题是可以解决,可原想程序集不安装在客户端,却要安装到全局程序集中
singleflower 2005-02-16
  • 打赏
  • 举报
回复
如何解决这个问题,我以前是这样解决这个问题的:
1、将客户端要引用的DLL程序集(也就是远程对象库)进行正确的签名。
2、在客户端的机器上将该DLL添加到全局程序集

问题解决。
webserv2 2005-02-16
  • 打赏
  • 举报
回复
接口
Samen168 2005-02-16
  • 打赏
  • 举报
回复
接口可以的

可是现在有几十个中间库,以后还会不断增加,如果全部提取接口会太庞大,如果只是用一个接口又会导致函数返回类型不明确

个人认为还是下载到本地比较合适,各位大虾有啥好点子?!
nga96 2005-02-12
  • 打赏
  • 举报
回复
UP
曲滨_銘龘鶽 2005-02-07
  • 打赏
  • 举报
回复
接口是绝对可以的
如果不可以就是其他的问题了。

如果想连一个类的函数都传过来在本地执行
那可不是 远程调用了 那就是下载后在本地执行了 是另一个问题了。

如果就传数据没必要用自己定义的对象,
DataTable HashTable,不够用吗?
我前一阵在东软 作的一个"日本电力收费系统" 的项目整个项目网络传输都是

HashTable 里面放一些 DataTable 或 一般数据类型
然后序列化 压缩加密一下以byte[]方式传出去
客户断接到后在解开

不过 HashTable key Value 对应的文档一定要写好
要不时间长了 就不好维护了
设计远程的程序时
越简单越好, 简单 在某种意义上 就是 效率 和 易维护
什么OO,OOP 都可以像后排

不过用的是 WebService 不是 remoting
曲滨_銘龘鶽 2005-02-07
  • 打赏
  • 举报
回复
最简单的回答就是 .net 远程序列化的是
类里的数据

不会把一个类的函数什么的都序列化了。

你发 Form 里面出错那个位置的代码,怎么还怕看???
噯卟釋手 2005-02-07
  • 打赏
  • 举报
回复
up
evaELLIS 2005-02-07
  • 打赏
  • 举报
回复
http://chs.gotdotnet.com/quickstart/howto/
gxh973121 2005-02-07
  • 打赏
  • 举报
回复
mark
jackie615 2005-02-07
  • 打赏
  • 举报
回复
mark
fds2003 2005-02-07
  • 打赏
  • 举报
回复
UP
takki 2005-02-07
  • 打赏
  • 举报
回复
up
sniper81 2005-02-06
  • 打赏
  • 举报
回复
我觉得最好事先规划好各个Assembly中的对象的通讯方式,或者都通过Assembly.Load加载到本地,或者通过.NET remote远程调用,或者采用web service,如果想到什么用什么,系统结构就不会很好,也不利于维护。
对于assembly2 或者 你也把它Load近来,或者在assembly1中通过.NET remote来调用assembly2。这样应该就不会有什么问题
AllenTing 2005-02-06
  • 打赏
  • 举报
回复
只有帮顶了
sniper81 2005-02-06
  • 打赏
  • 举报
回复
我觉得
Assembly.LoadFrom(assembly1_URL); 方法是从网络URL把Assembly加载到本地,然后在本地执行,所以这应该不算事一种remote调用,
所以如果你的assembly1里面调用assembly2的对象时不是采用.net remote方式调用的话,就会出错。
不知道实际是不是这样。
你的assembly1里面调用assembly2的对象是用.NET remote吗?
加载更多回复(20)
ASP.NET程序中常用的三十三种代码 1. 打开新的窗口并传送参数:   传送参数: response.write("window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)")   接收参数: string a = Request.QueryString("id"); string b = Request.QueryString("id1");   2.为按钮添加对话框 Button1.Attributes.Add("onclick","return confirm(’确认?’)"); button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}")   3.删除表格选定记录 int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex]; string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()   4.删除表格记录警告 private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e) {  switch(e.Item.ItemType)  {   case ListItemType.Item :   case ListItemType.AlternatingItem :   case ListItemType.EditItem:    TableCell myTableCell;    myTableCell = e.Item.Cells[14];    LinkButton myDeleteButton ;    myDeleteButton = (LinkButton)myTableCell.Controls[0];    myDeleteButton.Attributes.Add("onclick","return confirm(’您是否确定要删除这条信息’);");    break;   default:    break;  } }   5.点击表格行链接另一页 private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) {  //点击表格打开  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)   e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);"); }   双击表格连接到另一页   在itemDataBind事件中 if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {  string OrderItemID =e.item.cells[1].Text;  ...  e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’"); }   双击表格打开新一页 if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {  string OrderItemID =e.item.cells[1].Text;  ...  e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)"); }   ★特别注意:【?id=】 处不能为 【?id =】   6.表格超连接列传递参数 程序异常处理类。  /// 自动将异常内容记录到Windows NT/2000的应用程序日志  ///  public class AppException:System.ApplicationException  {   public AppException()   {    if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误。");   }  public AppException(string message)  {   LogEvent(message);  }  public AppException(string message,Exception innerException)  {   LogEvent(message);   if (innerException != null)   {    LogEvent(innerException.Message);   }  }  //日志记录类  using System;  using System.Configuration;  using System.Diagnostics;  using System.IO;  using System.Text;  using System.Threading;  namespace MyEventLog  {   ///   /// 事件日志记录类,提供事件日志记录支持   ///   /// 定义了4个日志记录方法 (error, warning, info, trace)   ///   ///   public class ApplicationLog   {    ///    /// 将错误信息记录到Win2000/NT事件日志中    /// 需要记录的文本信息    ///    public static void WriteError(String message)    {     WriteLog(TraceLevel.Error, message);    }    ///    /// 将警告信息记录到Win2000/NT事件日志中    /// 需要记录的文本信息    ///    public static void WriteWarning(String message)    {     WriteLog(TraceLevel.Warning, message);      }    ///    /// 将提示信息记录到Win2000/NT事件日志中    /// 需要记录的文本信息    ///    public static void WriteInfo(String message)    {     WriteLog(TraceLevel.Info, message);    }    ///    /// 将跟踪信息记录到Win2000/NT事件日志中    /// 需要记录的文本信息    ///    public static void WriteTrace(String message)    {     WriteLog(TraceLevel.Verbose, message);    }    ///    /// 格式化记录到事件日志的文本信息格式    /// 需要格式化的异常对象    /// 异常信息标题字符串.    ///    /// 格式后的异常信息字符串,包括异常内容和跟踪堆栈.    ///    ///    public static String FormatException(Exception ex, String catchInfo)    {     StringBuilder strBuilder = new StringBuilder();     if (catchInfo != String.Empty)     {      strBuilder.Append(catchInfo).Append("\r\n");     }     strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);     return strBuilder.ToString();    }    ///    /// 实际事件日志写入方法    /// 要记录信息的级别(error,warning,info,trace).    /// 要记录的文本.    ///    private static void WriteLog(TraceLevel level, String messageText)    {     try     {      EventLogEntryType LogEntryType;      switch (level)      {       case TraceLevel.Error:        LogEntryType = EventLogEntryType.Error;        break;       case TraceLevel.Warning:        LogEntryType = EventLogEntryType.Warning;        break;       case TraceLevel.Info:        LogEntryType = EventLogEntryType.Information;        break;       case TraceLevel.Verbose:        LogEntryType = EventLogEntryType.SuccessAudit;        break;       default:        LogEntryType = EventLogEntryType.SuccessAudit;        break;      }      EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );      //写入事件日志      eventLog.WriteEntry(messageText, LogEntryType);     }    catch {} //忽略任何异常   }  } //class ApplicationLog }   12.Panel 横向滚动,纵向自动扩展   13.回车转换成Tab  if (event.keyCode==13 && event.srcElement.type!=’button’ && event.srcElement.type! =’submit’ &&     event.srcElement.type!=’reset’ && event.srcElement.type!=’’&& event.srcElement.type!=’textarea’);    event.keyCode=9; onkeydown="if(event.keyCode==13) event.keyCode=9"   14.DataGrid超级连接列 DataNavigateUrlField="字段名" DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}"   15.DataGrid行随鼠标变色 private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) {  if (e.Item.ItemType!=ListItemType.Header)  {   e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");   e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");  } }   16.模板列   后台代码 protected void CheckAll_CheckedChanged(object sender, System.EventArgs e) {  //改变列的选定,实现全选或全不选。  CheckBox chkExport ;  if( CheckAll.Checked)  {   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)   {    chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");    chkExport.Checked = true;   }  }  else  {   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)   {    chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");    chkExport.Checked = false;   }  } }   17.数字格式化   【的结果是500.0000,怎样格式化为500.00?】 int i=123456; string s=i.ToString("###,###.00");   18.日期格式化   【aspx页面内:   显示为: 2004-8-11 19:44:28   我只想要:2004-8-11 】   应该如何改?   【格式化日期】   取出来,一般是 object((DateTime)objectFromDB).ToString("yyyy-MM-dd");   【日期的验证表达式】   A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31] ^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$   B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03] ^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$   【大小写转换】 HttpUtility.HtmlEncode(string); HttpUtility.HtmlDecode(string)   19.如何设定全局变量   Global.asax中   Application_Start()事件中   添加Application[属性名] = xxx;   就是你的全局变量   20.怎样作到HyperLinkColumn生成的连接后,点击连接,打开新窗口?   HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")   【ASPNETMENU】点击菜单项弹出新窗口   在你的menuData.xml文件的菜单项中加入URLTarget="_blank",如: ......   最好将你的aspnetmenu升级到1.2版   21.读取DataGrid控件TextBox值 foreach(DataGrid dgi in yourDataGrid.Items) {  TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");  tb.Text.... }   23.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE (金额)分别在5.6.7列,要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?   〖思归 function DoCal() {  var e = event.srcElement;  var row = e.parentNode.parentNode;  var txts = row.all.tags("INPUT");  if (!txts.length || txts.length < 3)   return;  var q = txts[txts.length-3].value;  var p = txts[txts.length-2].value;  if (isNaN(q) || isNaN(p))   return;  q = parseInt(q);  p = parseFloat(p);  txts[txts.length-1].value = (q * p).toFixed(2); }   24.datagrid选定比较底下的行时,为什么总是刷新一下,然后就滚动到了最上面,刚才选定的行因屏幕的关系就看不到了。 page_load page.smartNavigation=true   25.在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小 ? private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e) {  for(int i=0;i

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧