【问题标题】:What causes PIA API to differ between Release and Debug build?是什么导致 PIA API 在 Release 和 Debug 版本之间存在差异?
【发布时间】:2019-11-30 20:31:36
【问题描述】:

我有一个来自第三方的 ocx,当我将控件添加到我的表单时,会从中创建主互操作程序集 (PIA)。 PIA 向我的 .NET 程序集公开一个 ActiveX API。

我发现奇怪的是,当我的解决方案设置为调试时,与我的解决方案设置为发布时相比,缺少一些功能。 Debug 和 Release 文件夹中 PIA 的元数据不同

发布:

#Region "Assembly AxInterop.DATARAYOCXLib, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null"
' C:\Users\...\Instruments\obj\x86\Release\AxInterop.DATARAYOCXLib.dll
#End Region

Imports System
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Namespace AxDATARAYOCXLib
    <AxHost.Clsid("{43555bb9-3fe0-11d6-9f4a-00a0cc40a4d2}")> <DefaultEvent("SendMessage")> <DesignTimeVisible(True)>
    Public Class AxGetData
        Inherits AxHost

    Public Overridable Function IsDataReady(index As Short) As Boolean

调试:

#Region "Assembly AxInterop.DATARAYOCXLib, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null"
' C:\Users\...\Instruments\obj\Debug\AxInterop.DATARAYOCXLib.dll
#End Region

Imports System
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Namespace AxDATARAYOCXLib
    <AxHost.Clsid("{43555bb9-3fe0-11d6-9f4a-00a0cc40a4d2}")> <DefaultEvent("SendMessage")> <DesignTimeVisible(True)>
    Public Class AxGetData
        Inherits AxHost

    ' IsDataReady is missing

不同的配置如何针对不同的 API?我最近将第三方软件更新到最新版本(不包括 IsDataReady),并删除了调试和发布文件夹中的 dll,并重新构建。 dll 回来了,但 Release 仍然看到 IsDataReady。有什么好办法解决这个问题?

这个我试过了……

  • 将解决方案设置为 Release
  • 删除了对 PIA 的引用(AxInterop.DATARAYOCXLib.dll 和 Interop.DATARAYOCXLib.dll)
  • 打开一个表单并将控件添加到 Program Files 的 ocx 中的工具箱中。此操作会创建 PIA (AFAIK) 并添加引用。
  • 已删除 bin 和 obj 文件夹
  • 构建
  • 检查 API。 IsDataReady 在那里

然后我在将解决方案设置为调试后重复了所有步骤。 IsDataReady 不存在。

我联系了供应商,他们说此功能已弃用,并且不包含在最新的 ocx 中。但是,我在 Release 中构建时肯定会看到它。

【问题讨论】:

  • 检查项目 bin 文件夹中的 exe 文件(debug、release)以及这些文件夹中的任何 dll 的时间戳。 debug 和 release 文件的时间戳应该一致。
  • @jdweng 我的类库使用ocx,并且PIA是自动创建和引用的,类库的每个debug和release目录下的PIA时间戳对应项目何时(重新)构建. (此时不涉及 exe,因为 exe 项目没有引用这个类库,它只是在构建后事件中将类库 bin 文件夹内容复制到自己的 bin 文件夹中。)
  • 我不确定我是否完全理解您所遇到的情况,但您的调试和发布配置是否可能针对不同的平台?
  • @TnTinMn 他们都针对 x86。我有很多 32 位库,这使它成为必需品
  • 当您更新您的源代码时,您必须重新构建调试和发布可执行文件才能正常工作。如果你只更新一个,那么另一个将不起作用。

标签: c# .net vb.net primary-interop-assembly


【解决方案1】:

我使用 Windows 搜索删除了整个解决方案目录中的每个 binobj 目录,然后重新构建。一些较低级别的依赖项目的一些手动构建是必要的。这解决了问题。现在我的 Debug 和 Release 版本都显示了正确的 API。

我曾尝试删除那些仅用于有问题的项目及其直接依赖项的目录,但这本身还不够。

我仍然不确定为什么这是必要的,或者为什么项目不会覆盖来自最新 ocx 的互操作程序集,即使它是 PC 上注册的唯一版本。我希望我不需要每次获得新版本的 ocx 时都这样做,但我会牢记这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2012-11-06
    • 2016-03-23
    • 2020-08-30
    相关资源
    最近更新 更多