从C#访问OCX库时出现“灾难性故障”

时间:2011-04-13 14:28:23

标签: c# interop activex ocx

我目前正在尝试使用C#应用程序中的第三方DLL。我已经注册了DLL并将其作为COM组件列表中的引用添加。据我所知,这应该创建必要的互操作类来从C#访问这个DLL。

在尝试从DLL中调用任何方法时,我得到以下异常: -

System.Runtime.InteropServices.COMException was unhandled
 Message=Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
 Source=mscorlib
 ErrorCode=-2147418113
 StackTrace:
  at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
  at OCXDLL._OCXDLL.MyMethod(Int32 param0, String param1, String param2, String param3, Int32 param4)
  at MyApplication.Program.Main(String[] args) in C:\MyApplication\Program.cs:line 29
  at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
  at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
  at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
  at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
  at System.Threading.ThreadHelper.ThreadStart()
 InnerException: 

我用来调用库的代码: -

using OCXDLL;

namespace MyApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   OCXDLL libObj = new OCXDLL();
   libObj.MyMethod(....); 
  }
 }
}

请注意,这不是ActiveX控件(我已经看到了许多解决此问题的解决方案)。

有没有人对我出错的地方有任何想法?

由于

2 个答案:

答案 0 :(得分:2)

为我解决了!

我有两个星期的同样问题!!!

我试图在c#中从我的ocx创建一个实例。该对象已成功创建,但我无法用该死的灾难性异常来调用它的方法。

 xPKTBLib.xPKTB p = new xPKTBLib.xPKTB()

如你所见,我试图从主对象创建一个实例并调用它的方法,但它不是正确的做法! 创建MFC项目时,会自动生成两个接口,您可以使用它们为入站或出站调用声明方法。一个带_D前缀(在我的例子中为_DxPKTB),一个带有_D前缀和事件后置修复(_DxPKTBEvents)。

当你想在c#中调用Activex方法时,你必须从它的接口创建一个实例,然后调用方法而不是直接调用基础对象的方法!

  xPKTBLib._DxPKTB p = new xPKTBLib.xPKTB();
这个技巧对我有用。希望对你也有用......

答案 1 :(得分:1)

Visual Studio

点击TOOLs-> OPTIONS-> DEBUGGING

仅禁用我的代码(仅管理)

如果启动时没有用户代码,则在此警告下

它为我工作。