[英]Late Binding Interop libraries for usage on multiple systems with c#
我正在嘗試編寫一個可以加載正確的 Interop office 庫並檢索有關該應用程序的信息的應用程序。 我一直在嘗試用文字來做到這一點。
Type wordType = Type.GetTypeFromProgID("Word.Application");
dynamic word = Activator.CreateInstance(wordType);
Console.WriteLine(word.Application.ActiveWindow.Document.FullName);
我打開了一個 word 文檔,但無法訪問 window。它會引發錯誤
System.Runtime.InteropServices.COMException (0x800A1098): Dieser Befehl ist nicht verfügbar, weil kein Dokument geöf.net ist。
翻譯成no Document is availabe
。
但是,如果我不使用后期綁定
var word = (Microsoft.Office.Interop.Word.Application)Marshal2.GetActiveObject("Word.Application");
Console.WriteLine(word.Application.ActiveWindow.Document.FullName);
我可以閱讀文檔文件...
如果我不能使用后期綁定,我必須編譯互操作並將其與應用程序一起發布。 我的目標是它使用已安裝程序的互操作(如果已安裝)。
如何連接到正確的實例並讀取有關活動 window 的信息?
順便說一下蘋果和橘子。 在第一個示例中,您生成了一個 Word 應用程序的新實例(沒有我可能添加的任何文檔),第二個示例是對現有的 Word 應用程序使用 IROT,該應用程序無疑有一個文檔,因此是活動的。
在您的第一個場景中,您只是生成了一個 Word 的新實例,但沒有創建一個 document 。 與大多數Office應用程序一樣,默認情況下Word啟動時沒有文檔。
改變:
Type wordType = Type.GetTypeFromProgID("Word.Application");
dynamic word = Activator.CreateInstance(wordType);
Console.WriteLine(word.Application.ActiveWindow.Document.FullName);
...到:
var wordType = Type.GetTypeFromProgID("Word.Application");
dynamic app = Activator.CreateInstance(wordType);
dynamic doc = app.Documents.Add(); // <---- the important bit
Console.WriteLine(doc.FullName);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.