【发布时间】: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