2

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

我发现奇怪的是,当我的解决方案设置为 Debug 时,与我的解决方案设置为 Release 时相比,缺少一些功能。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。解决这个问题的好方法是什么?

我试过这个...

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

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

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

4

1 回答 1

1

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

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

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

于 2019-07-24T20:15:21.030 回答