嵌入互操作類型(Embed Interop Types)
運用office編程調用Excel 的PIA時Microsoft.Office.Interop.Excel.dll時會產生如下問題:
1.提示錯誤:未能加載文件或程序集“Microsoft.Office.Interop.Excel.dll”
2.安裝的Excel PIA版本和編譯時使用PIA的版本不一致。
解決方案:
通過 /link 選項,可以部署包含嵌入類型信息的應用程序。 這樣,該應用程序無需引用運行時程序集,便可以使用運行時程序集中實現嵌入類型信息的類型。如果發布了各種版本的運行時程序集,則包含嵌入類型信息的應用程序可以使用各種版本,而不必重新編譯。有關示例,請參見 演練:嵌入托管程序集中的類型(C# 和 Visual Basic)。使編譯器允許正在編譯的項目使用指定程序集中的 COM 類型信息。
當涉及 COM 互操作時,使用 /link 選項尤為有用。 通過嵌入 COM 類型,您的應用程序不再要求目標計算機上有主互操作程序集 (PIA)。/link 選項指示編譯器:將所引用互操作程序集中的 COM 類型信息嵌入生成的編譯代碼中。 該 COM類型由 CLSID (GUID) 值標識。這樣,您的應用程序可以在安裝有 CLSID 值相同的相同 COM 類型的目標計算機上運行。自動執行 Microsoft Office 的應用程序就是很好的示例。由於 Office 這樣的應用程序通常在不同的版本中采用相同的 CLSID 值,因此只要目標計算機上安裝有 .NET Framework 4 或更高版本,且您應用程序使用的方法、屬性或事件包含在所引用 COM 類型中,您的應用程序就可以使用引用的 COM 類型。
/link 選項僅嵌入接口、結構和委托。 不支持嵌入 COM 類。
若要在 Visual Studio 中設置 /link 選項,請添加程序集引用,並將 Embed Interop Types 屬性設置為 true。Embed Interop Types 屬性的默認設置為 false。
在代碼中創建嵌入 COM 類型的實例時,必須使用適當的接口來創建該實例。如果嘗試使用 CoClass 創建嵌入COM 類型的實例,將導致錯誤。
——/link(C# 編譯器選項)
在引用 COM 對象的應用程序中嵌入類型信息,則可以不需要主互操作程序集 (PIA)。此外,利用嵌入的類型信息可實現應用程序的版本中立性。即,可以將程序編寫為使用多個 COM 庫版本中的多個類型,而不是每個版本都需要一個特定的 PIA。對於使用 Microsoft Office 庫中對象的應用程序,這是一種常用方案。嵌入類型信息后,程序的同一個生成可以使用不同計算機上的不同 Microsoft Office 版本,而無需為 Microsoft Office 的每個版本重新部署該程序或 PIA。
由於嵌入的互操作類型信息,本演練中創建的應用程序將以不同的 Microsoft Office 版本運行。如果 Embed Interop Types 屬性設置為 False,則必須為應用程序以后運行時使用的每個 Microsoft Office 版本包括一個PIA。
——演練:嵌入 Microsoft Office 程序集中的類型信息(C#和 Visual Basic)
——如何:通過使用 Visual C# 2010 功能訪問 Office 互操作對象(C# 編程指南)
dynamic編程的知識需要進一步了解。
關於ODBC數據源和Office互操作的問題解決方案:
1.ODBC數據源
AccessDatabaseEngine.exe是Office2007 Access的ODBC數據庫驅動程序。
如果系統安裝的是Office2003(Version 11.0),一般會提供了OLEDB8.0(Jet4.0)驅動程序支持(*.xls)讀取,此時不會支持OLEDB12.0格式數據(*.xlsx)的讀取,請安裝AccessDatabaseEngine.exe,之后將支持兩種格式。
2.系統安裝了Office2007(Version 12.0)會提供了OLEDB8.0和12.0的數據庫驅動程序,可通過Windows\System32\odbcad32.exe(或者64bit OS路徑Windows\SysWow64\odbcad32.exe)查看。
安裝了Office2010(Version 14.0)會提供8.0、12.0和14.0的數據庫驅動程序。
程序編譯為x86項目,所以安裝32位的Office驅動程序。
2.Office互操作(Microsoft.Office.Interop.Excel.dll)
添加.net引用dll,將“嵌入式互操作”設置為true。這樣對安裝部署的機器沒有Office版本限制。(原理如上)