当我从我的机器上运行时,一切都可以正常工作,适用于其他用户.我不是Excel interop专家,希望你们可以帮助我.
这是如何设置的:
我添加了一个对我的应用程序的引用到Microsoft.Office.Interop.Excel.dll,版本10.0.4504.0(我相信是Excel 2002).在我的机器上我已经安装了Excel 2007.
在我的代码中,我尝试打开一个这样的工作表:
using Microsoft.Office.Interop ... Microsoft.Office.Interop.Excel.ApplicationClass _excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); Microsoft.Office.Interop.Excel.Workbook excelWorkbook = _excelApp.Workbooks.Open(workbookPath,true,5,"",Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,false,false); Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets; Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item(1);
我将用户版本记录为Excel 9.0(即2000).用户获取的错误是:
Exception='System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename,Object UpdateLinks,Object ReadOnly,Object Format,Object Password,Object WriteResPassword,Object IgnoreReadOnlyRecommended,Object Origin,Object Delimiter,Object Editable,Object Notify,Object Converter,Object AddToMru,Object Local,Object CorruptLoad)
看起来工作簿无法打开.该文件已被确认存在,并刚刚松动在用户的PC上C:.我以为通过使用PIA我不用担心Excel版本的问题.我知道还有其他用户使用Excel 2000,它在我的开发机器上工作.
有任何想法吗?也许我打电话打开Excel文件应该改变?不幸的是,我无法再现它.
解决方法
“I thought by using the PIA I wouldn’t
have to worry about Excel version
issues. I know there are other users
using Excel 2000,and it works on my
dev machine.”
几乎是真的,但不完全.
通过针对Excel 2002的PIA开发,您的程序将兼容所有版本的Excel 2002(10.0)及更高版本.然而,失败的机器正在运行Excel 2000(9.0),它是您开发的版本低于其版本的版本.
在Excel 2002下没有官方支持的PIA,所以如果你需要你的程序在Excel 2000(9.0)上运行,那么你将必须创建自己的定制互操作程序集.您可以使用TlbImp.exe为Excel 9.0创建一个互操作程序集,如第Achieving Backward Compatibility with .NET Interop: Excel as Case Study条所述.
如果您的程序集是强名,那么您需要创建一个强名的互操作程序集.这可以通过/ keyfile开关提供.pfx或.snk文件的名称来实现,如文章How to create a Primary Interop Assembly (PIA)所示.该文章还使用/ primary开关来创建“主互操作程序集” .在您的情况下,使互操作组合不是真正需要的,但不会受到伤害.然而,文章省略的是使用/ sysarray开关,您应该使用它.
然而,制作强大的互操作程序集确实有一些复杂性.有关更多详细信息,请阅读Using TLBIMP.exe to create Strong Named Interop Assemblies.(除此之外,本文还介绍了/ sysarray开关的需要.)
简而言之,如果你的程序集不是很强名,那么做一个自定义的互操作程序集是非常简单的.如果您的程序集强大命名,那么更复杂,因此,您需要创建一个强名的互操作程序集.但希望这些文章应该让你走.
– 麦克