最近一段时间因为一个系统需要用到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