Dot Net技术细节问题Q&A (转过来,有小改动)

时间:2022-02-06 11:04:17

今天有个Partner问了我一些.NET开发的技术细节问题,我给他一个个说了一下。顺便也贴在下面,要是有说错的地方给指正一下

1、一个程序集被其他项目引用后,编译的时候会出现如下错误:
未能将临时文件复制到输出目录中。
无法将文件“Dhthx.BusinessRules.D.dll”复制到运行目录。另一个程序正在使用此文件,进程无法访问。
需要关闭Visual Studio.Net,删除以前生成的dll文件后才能重新编译,怎样解决?

常见的两种可能性是:
> 这个Dll是不是隶属于一个WinForm程序,而这个Windows程序正在运行中?
> 这个Dll是不是被注册成COM组件了?
可以用FileMon(
http://www.sysinternals.com/ntw2k/source/filemon.shtml)这个工具来查看一下到底是什么进程在使用这个文件。

ms提供的技术支持:http://support.microsoft.com/default.aspx?id=313512

CAUSE

This problem may occur when one of the assemblies that you compile is larger than 64 kilobytes (KB) and one (or both) of the following conditions is true:
Your solution contains projects that are compiled to the same output folder.
The Copy Local property on one of the referenced assemblies or projects is set to False.

RESOLUTION
To work around this problem, do any (or all) of the following, as appropriate for your projects:
Compile the outputs for individual projects to different folders. Visual Studio .NET 2002 and Visual Studio .NET 2003 do not support a common output folder.
Set the Copy Local property for the referenced assembly or project to True.
Verify that you do not have the Object Browser window open.
Verify that you do not have the same project (or projects) open in another instance of Visual Studio .NET.
Note Microsoft strongly recommends that you use project references instead of assembly references. Assembly references do not contribute to the file locking problem. However, when you use assembly references, you must set the build order manually. When you use project references, the build order is established automatically.

 


2、在开发WinForm应用的时候,如果使用ActiveX控件,例如flash插件或IE控件时会随机出现使用try catch结构无法捕捉的运行期异常,怎样避免这种现象发生?

具体的解决这个问题需要看代码和插件。我自己并没有遇到过IE控件(AxBrowser)发生这种情况。一种可能的原因是异常抛出在另一个Apartment或者线程中。如果是这样的话,我用过的做法是在Main()函数里面捕捉:
static void Main()
{
   Application.Run(new Form1());
}
最好的做法是能够设法使这个异常能够复现(reproduce),然后用debug方式来排错。


也可以用AppDomain的 UnhandledException handler 或 Application的 ThreadException event handler处理
参考站点 http://www.codeproject.com/dotnet/unhandledexceptions.asp

3、能否将WinForm程序编译成能够脱离Framework运行的本地代码?

不能。至少到目前为止没有看到服务于这个目的的工具,虽然说理论上有一定的可能性。这就好像2001年的时候还没有可以合并两个Assembly的工具,但到了2004年就有人写出来了。

最好的做法是把WinForm程序用VS.NET里面的Setup Project打包成msi来发布,这样可以在Setup Project里面设定Require .NET Framework,这样用户安装时会被提示先安装NET FX。


4、怎样能够改善WebForm页面频繁刷新的问题?

频繁刷新是因为AutoPostBack引起的。可以在aspx文件头上设定AutoPostBack(原文是AutoFireEvent属性。还可以根据这两个关键词到MSDN里面查询一下。


5、如何将包含可视化控件、定义的方法和事件处理程序的窗体序列化,保证在反序列化后,控件和事件仍能够正常运行?

窗体本身是不能序列化的,因为System.Windows.Form类是从MarshalByRefObject继承的。而且窗体也无法做到序列化,因为WinForm窗体仍然是实现在Win32的GUI资源上的,仍然会分配窗口句柄、设备上下文等。

但是可以根据不同的场景,用不同的方法来实现具体的需要(而不一定要用序列化)。例如,可以利用Windows Forms Markup Language(http://blog.joycode.com/mvm/posts/15388.aspx);也可以把窗体中的关键现场用自定义序列化([Serializable])的方式保存下来,然后再恢复。等等。


6、如何构造一个正则表达式,用来匹配含有嵌套的C#块注释,例如:/* ……/*……*/……*/

可以用:/\*.{0,}/\*.{0,}\*/.{0,}\*/
 
调试正则表达式可以用这个工具:http://renschler.net/regexbuilder/

参考站点http://www.regexlib.com

7、在windows上开发的程序集能否直接在WinCE.NET上应用?

不可以。哪怕.NET开发的也不可以。WinCE.NET上用的.NET是.NET Compact Framework,有很多不同,例如不支持Drag & Drop,不支持Web Service的服务器,不支持MDI(Multi document interface)。

需要在源代码级别上做一定的修改,重新编译才可以。这个工作可以在VS.NET 2003里面被支持的很好。


8、如何在数据库操作中使用嵌套事务?

可以查看SQL Server的文档:http://msdn.microsoft.com/library/en-us/acdata/ac_8_md_06_66nq.asp。不过建议尽量少用嵌套式事务。


9、以后会不会有Microsoft自己的报表开发工具?

已经有了。可以查询SQL Server 2000 Reporting Service(http://www.microsoft.com/sql/reporting/default.asp)。
这个工具是免费的,如果购买了SQL Server 2000标准版或者企业版的,可以在微软中国首页免费申请SQL Server 2000 Reporting Service的正式版光盘。


10、三层结构中抛出异常的try...catch块应该放在表示层还是数据处理层?

每一层都最好能有。数据处理层应该负责收集尽量多的现场,表示层应该负责转换成友好的出错页面,如果能提供Error Code和友好的错误原因就更好了。
在ASP.NET中用Application_OnError()可以更好的处理错误页面重定向。也可以参考:“Exception Management Application Block for .NET”。

关于统一的错误处理,我比较倾向于在Application_Error()中进行,逻辑层只把产生的exception向外扔,在表式层中调用时进行统一的try catch。好处是不用关心发生错误后的处理,把这工作冒泡到表式层去统一做好了;也有不好的地方,就是表式层容易忘了处理,结果就由ASP.NET和.NET Framework帮着处理了,不过通常都不会引起蓝屏:)