我使用此代码将两个word文档与ofice单词互选进行比较:
object missing = System.Reflection.Missing.Value;
object readonlyobj = false;
object filename = FirstDocx;
//Call assemblys dynamically
dynamic objEApp = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
string strAssemblyOff2007 = "Microsoft.Office.Interop.Word, Version=" + objEApp.Version + ".0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c";
Assembly xslWordAssembly = Assembly.Load(strAssemblyOff2007); //Load Assembly
Type type = xslWordAssembly.GetTypes().Single(t => t.Name == "ApplicationClass");
dynamic app = Activator.CreateInstance(type);
//var docs = app.Documents;
//
//Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
var doc = app.Documents.Open(
ref filename, ref missing, ref readonlyobj, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
string filenm = SecondDocx;
string nm = FirstDocx;
object filesavename = nm;
doc.TrackRevisions = true;
doc.ShowRevisions = true;
doc.PrintRevisions = true;
doc.Compare(filenm);
doc.Close(ref missing, ref missing, ref missing);
app.Quit(ref missing, ref missing, ref missing);
First & Second Docx 是我的文件。在代码中,我动态加载程序集,但是当我想在var doc = app中打开第一个docx时。文档打开(我收到此错误:
Could not convert argument 0 for call to Open.
我该如何解决?
而不是
var doc = app.Documents.Open(ref filename, ref missing, ref readonlyobj, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
简单尝试
var doc = app.Documents.Open(@filename);
这是数据类型的问题。当 COM 类型库被分析并转换为 C# 的 (P)IA 时,数据类型必须调整为 C# 理解的内容。C#(最初)不理解可选参数 - 本机它使用重载。因此,VBA 可选参数必须作为对象"通过引用"传递。但必需参数保留数据类型。
参数文件名不是可选的,它键入为字符串。所以你需要:
string filename = FirstDocX;