【问题标题】:"Catastrophic failure" when accessing an OCX library from C#从 C# 访问 OCX 库时出现“灾难性故障”
【发布时间】:2023-03-20 13:45:01
【问题描述】:

我目前正在尝试从我的 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 控件(我已经看到了许多解决此问题的解决方案)。

有人知道我哪里出错了吗?

谢谢

【问题讨论】:

  • 我也一直在用“灾难性失败”(WTF?我们被陨石击中?!)敲我的头,但我的错误随机出现和消失。连续 10 次启动项目(无需编辑或重新编译)会出现大约两次错误。谁知道... :|
  • 这很奇怪。当在错误的线程上调用控件时,控件通常会返回 E_UNEXPECTED,但看起来您在这里没有任何奇怪的线程逻辑。我会打电话给第三方,询问他们是否熟悉这个问题。
  • 我们以前使用非常旧的第三方 com API 也遇到过这些问题,我们总是不得不联系供应商并让他们对其进行排序,没有源代码很难知道。
  • 在 Windows 7 上运行?我发现我的一个遗留库拒绝在启用 DEP 的情况下运行。试试 bcdedit.exe {current} /set nx alwaysoff 看看这是否是你的问题。
  • Eric - 是的,不涉及多线程。这只是一个简单的控制台应用程序,试图让库正常工作。 Jason - 我正在 Windows XP 上开发。感谢大家的建议和想法。我决定编写自己的库实现。这比等待供应商尝试解决问题要快。

标签: c# interop activex ocx


【解决方案1】:

为我解决了!

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

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

 xPKTBLib.xPKTB p = new xPKTBLib.xPKTB()

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

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

  xPKTBLib._DxPKTB p = new xPKTBLib.xPKTB();

这个技巧对我有用。希望对你也有用...

【讨论】:

    【解决方案2】:

    视觉工作室

    点击工具->选项->调试

    仅禁用我的代码(仅限托管)

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

    这对我有用。

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 2016-03-21
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多