C# 代码中调用ActiveX控件更新接口造成编译错误的问题

这个问题困扰了我很久,应用场景是项目使用VC++开发一个基于COM的ActiveX控件。然后在C#中调用这个ActiveX控件进行日常的调试等操作。

可是每次ActiveX项目有接口更新,C#中也修改了新接口规范的调用。可是死活C#代码无法编译通过。  可以确认ActiveX项目本身接口确实正常导出并且调用Regsvr32进行注册了。 可是为什么在C#死活还是看不到更新的接口提示接口不兼容呢?


后来查了一些资料C#项目在调用ActiveX控件的时候会自动生成两个文件AxInterop.xxx.dll 和Interop.xxx.dll 也可以使用工具自己生成


if you use com or not assembly class, vs.net will translate it to Interop and AxInterop. you can use Aximp.exe to change your com object to assembly.

this file in \Microsoft Visual Studio.net\FrameworkSDK\Bin directory


于是我就用了这个工具自己创建了AxInterop 和Interop这两个dll 并放在OCX目录下结果,还是报错。无法编译通过。甚至尝试了unload reload 还原项目代码都不行。


最后在stackoverflow上看到一篇文章,类似于讲com控件的Intellise Cache缓存机制。就是VS/OS 会给你调用的com组件做一个缓存,在系统目录生成相应的C#代码定义文件(确实报错的时候查看接口定义是在一个temp目录下的,并且只读不可修改,在退出VS后会自动被删除)


于是问题的解决方法看来是要想办法让系统更新缓存,那系统是什么时候判断缓存刷新了帮你更新接口的呢? 

也正是歪打正着,我无意识的把报错的代码更注释了(不想在这个问题上卡太久)编译通过了。同时我看到了VS提示这样一行信息

CSC : warning CS1762: A reference was created to embedded interop assembly 'c:\Windows\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll' because of an indirect reference to that assembly created by assembly xxx\Interop.ATSWordLib.dll'. Consider changing the 'Embed Interop Types' property on either assembly.

大概意思就是Interop这个dll由于使用了间接引用因此会在系统内的某目录创建一个副本,日常都是调用这个副本直到编译成功以后 VS才会去对比com组件来更新这个副本。

囧这不是霸王条款么!当然微软的解决方案是让你修改Embed Interop Types  默认值是False。 


好吧知道了问题的解决方法就好办了。可以直接修改这Embed Interop Types 或者 以后ActiveX控件有接口更新,先重新编译一次C#代码让他刷新缓存,再修改C#代码来同步更新的接口。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 ActiveX 控件来自定义 CAD 的全局坐标。以下是一些步骤供您参考: 1. 首先,确保您已经安装了适当的 CAD 软件,并且该软件提供了 ActiveX 控件的支持。 2. 在 C# 项目,添加对 CAD ActiveX 控件的引用。这通常可以通过右键单击项目,选择 "添加引用",然后在 COM 选项卡找到合适的控件。 3. 在代码创建一个控件实例,并将其添加到您的窗体或用户控件。例如: ```csharp using CADActiveX; // 创建控件实例 CADControl cadControl = new CADControl(); // 将控件添加到窗体或用户控件 this.Controls.Add(cadControl); ``` 4. 初始化并连接 CAD 控件。这可能涉及到设置一些属性或调用一些方法来加载 CAD 文件或进行其他必要的操作。 5. 通过控件提供的 API,您可以访问和操作 CAD 的全局坐标。具体的方法和属性取决于您使用的 CAD 软件和其提供的功能。您可以查阅相应的文档或参考 CAD 控件的 API 文档。 例如,如果您想获取当前选择的图形对象的全局坐标,您可以使用类似以下的代码: ```csharp CADObject selectedObject = cadControl.GetSelectedObject(); Point3D globalPosition = selectedObject.GetGlobalPosition(); ``` 请注意,这只是一个示例,具体的实现方式可能因不同的 CAD 软件而异。您需要根据您使用的 CAD 控件的 API 来确定正确的方法和属性。 希望这些信息对您有帮助!如有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值