C# 是什么导致发布版和调试版之间的PIAAPI不同?

C# 是什么导致发布版和调试版之间的PIAAPI不同?,c#,.net,vb.net,primary-interop-assembly,C#,.net,Vb.net,Primary Interop Assembly,我有一个来自第三方的ocx,当我向表单添加控件时,将从该ocx创建主互操作程序集(PIA)。PIA向my.NET程序集公开ActiveX API 我发现一件奇怪的事情是,当我的解决方案设置为Debug时,与我的解决方案设置为Release时相比,有些函数丢失了。调试和发布文件夹中PIA的元数据不同 发布: #区域“程序集AxInterop.datarayocklib,版本=1.1.0.0,区域性=中性,PublicKeyToken=null” 'C:\Users\…\Instruments\ob

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

我发现一件奇怪的事情是,当我的解决方案设置为Debug时,与我的解决方案设置为Release时相比,有些函数丢失了。调试和发布文件夹中PIA的元数据不同

发布:

#区域“程序集AxInterop.datarayocklib,版本=1.1.0.0,区域性=中性,PublicKeyToken=null”
'C:\Users\…\Instruments\obj\x86\Release\AxInterop.datarayocklib.dll
#末端区域
导入系统
导入System.ComponentModel
导入System.Runtime.InteropServices
导入System.Windows.Forms
命名空间AxDATARAYOCXLib
公共类AxGetData
继承AxHost
作为布尔值的公共可重写函数IsDataReady(索引尽可能短)
调试:

#区域“程序集AxInterop.datarayocklib,版本=1.1.0.0,区域性=中性,PublicKeyToken=null”
'C:\Users\…\Instruments\obj\Debug\AxInterop.datarayocklib.dll
#末端区域
导入系统
导入System.ComponentModel
导入System.Runtime.InteropServices
导入System.Windows.Forms
命名空间AxDATARAYOCXLib
公共类AxGetData
继承AxHost
“IsDataReady丢失了
不同的配置如何针对不同的API?我最近将第三方软件更新为最新版本(不包括IsDataReady),并删除了调试和发布文件夹中的DLL,然后重新构建。DLL回来了,但发布版仍然看到IsDataReady。解决这个问题的好方法是什么

我试过这个

  • 将解决方案设置为发布
  • 删除了对PIA的引用(AxInterop.datarayocklib.dll和Interop.datarayocklib.dll)
  • 打开窗体并将控件添加到程序文件中ocx中的工具箱中。此操作创建PIA(AFAIK)并添加引用
  • 已删除的bin和obj文件夹
  • 建造
  • 检查API。IsDataReady在那里吗
然后,在将解决方案设置为Debug之后,我重复了所有步骤。IsDataReady不在那里


我联系了供应商,他们说此功能已被弃用,并且未包含在最新的ocx中。但是,在发布版中构建时,我确实看到了它。

我使用Windows Search删除了整个解决方案目录中的每个
bin
obj
目录,然后重新构建。一些较低级别的独立项目需要一些人工建筑。这就解决了问题。现在,我的调试和发布版本都显示了正确的API

我曾尝试删除那些目录,只是为了那个有问题的项目及其直接依赖项,但这本身是不够的


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

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