在计算机编程领域,尤其是C#编程中,存在一个既有趣又略显复杂的现象。那就是文档,作为可嵌入的OLE对象,其表现更接近于控件,而非常规的OLE对象。虽然这属于较为技术性的内容,但对于从事相关开发工作的专业人士来说,深入研究这一点是非常有价值的。
文档的属性特殊
这份文档具有独特性。它被视为一个整体。比如,在处理某些大型项目时,我们常看到它仅作为单一资源被查阅或搜集,同时它也可能包含其他文件,比如绑定器文件等。此外,C# 2005和C#.NET并不直接支持此类文档的托管,开发者需借助控件来进行操作。
这给开发工作带来了不小的挑战。比如,在一个企业级办公软件的开发项目中,团队打算用C#来处理涉及众多文档资源的管理功能。这样的限制使得最初的技术选择和规划变得非常困难,他们不得不更多地思考如何适应这一状况。
aximp %WINDIR%system32shdocvw.dll
创建打开文档的C#应用步骤
要在C#中开发一个能打开特定文档的应用,需要遵循一系列操作。如果在C# 2005版本中找不到.dll文件,就需要在命令行界面执行一系列特定的指令。此外,还需为Web浏览器控件生成公共语言运行时代理文件(.dll)以及窗体代理文件(.dll)。
在实际的项目操作中,尤其是在一个小规模的文档处理软件创业项目里,若开发团队打算运用该技术搭建基础架构,就得严格遵守一系列流程。若稍有疏忽,比如未能准确添加.dll文件,或是操作指令出现错误,那么程序中关于文档打开的功能将难以正常运作。
C# 2005 中的相关操作
using System.Reflection;
C# 2005版本中涉及众多操作细节。控件会随文本资源管理器一同显示在工具箱中。开发者可利用工具箱将控件添加至Form1,此举将为Form1类增加众多成员变量。此外,还需在Form1的代码窗口里,将特定命名空间加入列表,并创建专属成员。
private Object oDocument;
公司内部进行办公软件优化工作时,开发者遵循既定步骤更新旧软件,可能会遭遇诸如不同框架间的不兼容等问题。若对这些细节处理不慎,更新后的软件在文档编辑功能上可能会出现新的错误。
处理事件代码
this.axWebBrowser1.NavigateComplete2 += new AxSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.axWebBrowser1_NavigateComplete2);
this.Load += new System.EventHandler(this.Form1_Load);
this.Closed += new System.EventHandler(this.Form1_Closed);
在Form1类方法的最后部分,需要加入代码来处理相关事件。在建立窗体项目过程中,C#系统会自动为项目添加一个窗体界面。Form1.cs文件是设计器生成代码的存放地,所有通过拖拽控件箱中的组件所生成的代码,都会被写入这个文件中。
private void button1_Click(object sender, System.EventArgs e)
{
}
有些学生对于实践项目的地点不太了解,结果在编写代码时找不到正确的位置。这导致他们编写的程序在事件处理方面存在缺陷。因此,程序在运行过程中对文档的处理不能按照预期来响应相关事件。
private void button1_Click(object sender, System.EventArgs e)
{
String strFileName;
//Find the Office document.
openFileDialog1.FileName = "";
openFileDialog1.ShowDialog();
strFileName = openFileDialog1.FileName;
//If the user does not cancel, open the document.
if(strFileName.Length != 0)
{
Object refmissing = System.Reflection.Missing.Value;
oDocument = null;
axWebBrowser1.Navigate(strFileName, ref refmissing , ref refmissing , ref refmissing , ref refmissing);
}
}
public void Form1_Load(object sender, System.EventArgs e)
{
button1.Text = "Browse";
openFileDialog1.Filter = "Office Documents(*.doc, *.xls, *.ppt)|*.doc;*.xls;*.ppt" ;
openFileDialog1.FilterIndex = 1;
}
public void Form1_Closed(object sender, System.EventArgs e)
{
oDocument = null;
}
public void axWebBrowser1_NavigateComplete2(object sender, AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e)
{
//Note: You can use the reference to the document object to
// automate the document server.
Object o = e.pDisp;
oDocument = o.GetType().InvokeMember("Document",BindingFlags.GetProperty,null,o,null);
Object oApplication = o.GetType().InvokeMember("Application",BindingFlags.GetProperty,null,oDocument,null);
Object oName = o.GetType().InvokeMember("Name",BindingFlags.GetProperty ,null,oApplication,null);
MessageBox.Show("File opened by: " + oName.ToString() );
}
2007程序文档情况
2007版在此方面有所区别。通常情况下,它不会在网页浏览器中直接打开文档。因此,在开发应用软件打开2007文档时,更推荐使用定制的文档容器而非控件。若现有应用需与该控件保持兼容,则需要调整注册表进行配置。
在大型企业进行办公软件系统升级的项目里,若是从旧版升级到2007文档处理模块,就必须注意兼容性问题。一旦决策出现偏差,企业办公效率可能会因文档无法正常打开而受影响。
查看文档相关问题
查看2007版程序文档时,可能会遇到一些特殊情况,比如会出现新窗口。若依照知识库中的文章所述方法去调整注册表,这可能会对程序中使用的控件产生影响。
从事软件维护的技术人员必须对此保持高度警觉。若未经全面考虑,轻率修改注册表,可能会引发一系列连锁反应,进而干扰软件系统对文档的处理。
在掌握了大量关于C#文档如何作为OLE对象嵌入及使用的知识后,你是否思考过若在个人项目中遇到类似问题该如何应对?若觉得这篇文章对你有所启发,不妨点个赞并转发一下。