今天有个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
• | 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
• | 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. |
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帮着处理了,不过通常都不会引起蓝屏:)