【问题标题】:Microsoft Excel Interop VersionMicrosoft Excel 互操作版本
【发布时间】:2018-02-21 01:39:12
【问题描述】:

我有一个 Windows 窗体应用程序,它被部署到我们网络中的许多用户机器上。我们的一些用户使用 Excel 2010,一些使用 2013,其他用户使用 2016。

过去,我曾指示开发人员使用 Interop 版本 14 进行编译,以确保跨版本的互操作性。不幸的是,有几次,该请求没有得到满足,我们遇到了用户问题。

了解我不是唯一的编码,如何最好地确保在编译应用程序时,它是使用互操作版本 14 编译的。

我考虑过的一些选项包括:

  • 在程序中添加一些东西来检查应用程序运行时的互操作,如果不是版本 14,则抛出错误。虽然是一种奇怪的方法,但它可以确保开发人员在使用错误的互操作版本时无法测试他们的代码
  • 构建后事件。我不确定这是否正确,也不知道具体该怎么做。

寻找任何建议。谢谢。

【问题讨论】:

  • 代码中的编译器指令。 #If...我已经忘记了这一点,直到我在自己的代码中遇到它。不知道它是否为您提供任何东西。只是一个想法,
  • 您可以创建一个 Excel 项目模板,该模板将具有所需的参考,以使其对人们来说变得简单。您的应用程序是否配置为使用 GAC 的 PIA(自找麻烦)或嵌入自 VS2010 以来推荐的互操作类型?
  • @tntinmn - 如果我从一开始就重新设计...我根本不会使用互操作...寻找验证引用版本是否正确的解决方案
  • 我问了一个非常基本的问题,即您是否嵌入互操作程序集,因为这会影响解决方案。我没有在哪里推荐重新设计(这是另一个人的回答),而是提供了一个想法,以防止在开发人员未采取明确行动的情况下对新项目进行不当引用。
  • 误解了...不是嵌入...@TnTinMn

标签: excel vb.net office-interop


【解决方案1】:

我根本不会使用互操作。很多事情都可能出错。我会使用 NPOI 或 OpenXML sdk 之类的库来创建电子表格。

https://github.com/tonyqus/npoi

http://vbnpoi.blogspot.com/

https://msdn.microsoft.com/en-us/library/office/bb448854.aspx

【讨论】:

  • 一切都很好,如果您从头开始...但这些是现有应用程序...转换它们需要时间和金钱...所有新开发不使用互操作...这绝对不是我要找的答案
【解决方案2】:

我有一个方法要放入 DLL:

''' <summary>
''' Checks the Version of Excel
''' It's Purpose Is To Ensure We Don't Deploy Wrong Interop Version
''' </summary>
''' <remarks></remarks>
Public Shared Sub CheckVersion(ByVal typeName As String, ByVal maximumVersion As Integer)

    Try

        Dim a2 As System.Reflection.Assembly = System.Reflection.Assembly.ReflectionOnlyLoad(typeName)
        Dim majorVersion As Integer = a2.GetName().Version.Major
        If majorVersion > maximumVersion Then
            Throw New ApplicationException("Invalid Version of " & typeName & " - Using Version " & majorVersion & " - Maximum Allowed Version " & maximumVersion)
        End If
    Catch iex As System.IO.FileNotFoundException
        Trace.WriteLine("VersionChecker - CheckVersion " & iex.Message & Environment.NewLine & iex.StackTrace)
        Throw New ApplicationException("File Not Found " & typeName & " - Note only works for interop types when Embed interop types is disabled and CopyLocal is true.", iex)
    Catch ex As Exception
        Trace.WriteLine("VersionChecker - CheckVersion " & ex.Message & Environment.NewLine & ex.StackTrace)
        Throw ex
    End Try

End Sub

然后像这样放入程序中:

VersionChecker.CheckVersion("Microsoft.Office.Interop.Excel", 14)

如果他们在加载程序时使用了错误的,它会爆炸,确保他们总是做对。

我不会接受,也许会有更好的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多