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

来源:互联网 发布:软件测试外包 编辑:程序博客网 时间:2024/05/22 05:32

这个问题困扰了我很久,应用场景是项目使用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 0