C#2005中Remoting/remoting回调/COM+/技术错误解决方案汇总

最近一段时间因为一个系统需要用到Remoting技术,同时需要用到COM+的事务控制,后来,将remoting的应用扩展到双向的通讯。总之整个过程比较烦琐,遇到了很多千奇百怪的问题好bug。所幸的是都被我一一解决!

在此将这些经验发布出来,以便后来的同志可以参考!

>>>>序列化的知识点

 1.什么情况下需要反序列化?
  直接或者间接继承了ISerializeable的类都要创建反序列化构造函数,
  除此,都由CLR自动控制。

2.实现ISerializeable的接口,只是为了自定义自己的对象序列化
  就是说:如果你的类有需要序列化的变量或者其他,你就必须创建一个反序列化的构造函数,
  protected BookInfo(System.Runtime.Serialization.SerializationInfo info) : base(info, context, false) {}

3.带有const的常量不需要序列化

4.如何反序列化?
  创建一个反序列化的构造函数,.....

>>>无法加载oramts.dll

在Oracle数据库的机器上操作:
1.根据KB 193893, 在Oracle里面建立两个视图,请使用SYS账号
脚本的默认路径在:oracle/ora92/rdbms/admin/xaview.sql

(使用sqlplus命令操作)
@oracle/ora92/rdbms/admin/xaview.sql
2.建立两个视图以后,需要给这两个新建立的视图添加Public权限:
SQL>grant select on v$xatrans$ to public with grant option;
SQL>grant select on v$pending_xatrans$ to public with grant option;
SQL>grant select any table to public;

在部署COM+ 组件的电脑上进行以下操作:
1. 根据KB 193893, 修改注册表:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSDTCMTxOCI
"OracleXaLib"="oraclient9.dll"
"OracleSqlLib"="orasql9.dll"
"OracleOciLib"="oci.dll"
如果是Windows 2003或者Windows XP2,我们还需要建立
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSDTCXADLL
然后添加名字为:
mtxoci.dll的字符串键
内容为:C:WINDOWSSYSTEM32MTXOCI.DLL

2. 如果您是在Windows 2003或者Windows XP上,我们需要给MSDTC账号设定对应的权限。
MSDTC运行在Network Service账号下。请您把Network Service账号添加到Administrators组里面。

3.将msvcrtd.dll拷到C:windows/system32/

4. 重新启动。运行程序。

Q:如何让Reomting对象面向接口:
A:
1.服务端的对象激活必须使用类类型,而不能使用接口

Q:由于激活没有在指定的时间内完成,COM+ 激活没有成功的解决方案!

A:在注册表中新增一个key。
Please see if setting "DisablePromotableTransactions" to "1" or "y" (REG_SZ   value) in the
HKLM/SOFTWARE/Microsoft/COM3   key   fixes   the   issue. If it does then the latest COM+ rollup should fix your problem.   Or   you   can   simply   use   that   registry   key. 

我自己这样操作:
直接在com3这里新增一个key,DisablePromotableTransactions   =   1.
一切OK!! 


Q:如何通过WinForm 程序中使用 Console 输出调试信息
A:
1. 新建一个WinForm程序;
2. 菜单"Project","Properties","Application",将"Output type"设置为“Console Application”;
这样在运行该WinForm程序时会启动一个控制台窗口。
可以使用:
Console.WriteLine();
Console.Write();
输出调试信息
个人觉得,这种方式比写日志或使用Debug.WriteLine()方便。

Q:三者的区别:
A:ExecuteReader   返回的是一个只读且向前读取的数据集,适合对数据进行查询,但是要在读取后关闭不然很浪费资源  
ExecuteScalar   只反回第数据集的第一行第一列。  
ExecuteNonQuery 返回受影响的行数,一般用来执行存储过程或是增、删、改操作  

Q:在将原始工程夹移动后,在运行会报错如下:
系统找不到指定的文件。 (异常来自 HRESULT:0x80070002)
A:实际是找不到了snk文件,
因此需要重新引用一下这个文件夹即可;

Q:如何生成snk文件
A: C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin
   使用如下命令:sn -k test.snk

Q:和System.EnterpriseServices.dll有关的目录:
A:  C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727
    一般会编译到目录:
C:/WINDOWS/WinSxS/x86_System.EnterpriseServices_b03f5f7f11d50a3a_2.0.0.0_x-ww_7d5f3790

>>>>自定义实体和强类型数据集

1.什么是自定义实体?
  类似java的实体bean,可以借助于工具(Nherbnater)来创建,
 [Serializable]
 public class AddressInfo {

        // Internal member variables
        private string firstName;
        private string lastName;
        private string address1;

        public string FirstName {
            get { return firstName; }
            set { firstName = value; }
        }

        public string LastName {
            get { return lastName; }
            set { lastName = value; }
        }

        public string Address1 {
            get { return address1; }
            set { address1 = value; }
        }
}

2.什么是强类型数据集
  VS.net提供的一种图形化的方法,以XDS(XML Dataset)后缀,
 

3.两者的比较?
  如果复杂度、数据量都很大,那么建模的时候完全是用   custome   entity   非常好、直观,而且OOA和OOP都很直观,
  能够准确捕捉到业务内涵。但是一旦和数据库联系上,难度就增大,就算是用NHibernate和IBatics,编写的代码都比较费劲,
  因为考虑到统计、查询、解耦等问题,表的设计有时候不得不好退而求次,而且对索引,Id建立都比较考究。
  当然那是对数据量很大的情况下,一次对数据表超过500w查询的时候考虑,(我面对的大概也就是500w左右)。  
  总的来说,对于这种复杂度、数据量都很大的情况,我认为custome   entity是个不错的选择,因为可以很容易把问题归纳,
  分析和建模都很容易,只是编程较难。不过我认为简单模型+局部复杂算法比   局部简单算法+复杂模型   的组合要好。  
   
  至于强类型dataset,有两个不太好,在同样的数据量下,他占内存比较多,这个没有认真计算过,
  但是强类型dataSet的与业务部无关的算法是比较多的。  
   
  但是他直接映射DB,对于大部分的程序员来说学习曲线比较低,是直接映射DB的。  
   
  不过,它却无法真实反映现实模型,如果对于那些很专业的业务来说。很多刚入行的程序员就无法直接通过强类型
  DataSet了解真实业务的情况。当然也不是说custome   entity一定能够,不过我相信,这个难度会比强类型DataSet要低得多。
  对于很多统计、查询等工作来说,反而变得简单,因为无需考虑太多面向对象的原则。但是重用率就较低。  
   

  相对来说,自定义的实体控制灵活,因此容易实现复杂逻辑,而强类型数据集比较笨重。

>>>>强命名的程序集如何使用非强命名程序集

1.   创建一个新的随机密钥对。

>>>>

Q: 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“Duplex.Contract.IDBServer”。
此操作失败的原因是对 IID 为“{C4189110-B261-392A-BEBF-F88CE5846ADA}”
的接口的 COM 组件调用 QueryInterface 因以下错误而失败:
不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。

A: 将接口的AssemblyInfo修改一下:
[assembly: ComVisible(true)]

 

d:/temp>   sn   -k   test.snk

2.   反编译目标程序集(假设是   a.dll)。

d:/temp>   ildasm   a.dll   /out=a.il

3.   重新编译,附带强命名参数。

d:/temp>   ilasm   a.il   /dll   /resource=a.res   /key=test.snk   /optimize

4.   验证签名信息。

d:/temp>   sn   -v   a.dll

 


你可能感兴趣的:(windows,String,C#,application,WinForm,dataset)