“Catastrophic failure” when accessing an OCX library from C#

…衆ロ難τιáo~ 提交于 2019-12-11 10:54:16

问题


I'm currently trying to use a third-party DLL from my C# application. I've registered the DLL and added it as a reference from the list of COM component. As I understand, this should create the necessary interop classes to access this DLL from C#.

On attempting to call any methods from within the DLL I get the following exception:-

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: 

And the code I'm using to call the library:-

using OCXDLL;

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

Note that this is not an ActiveX control (for which I have seen a number of solutions to fix this problem).

Does anyone have any ideas as to where I'm going wrong?

Thanks


回答1:


Solved For Me!

I had the same problem for about two weeks!!!

I was trying to create an instance from my ocx in c#. the object was successfully created but I was unable to call its methods with the damn Catastrophic Exception.

 xPKTBLib.xPKTB p = new xPKTBLib.xPKTB()

As you see I was trying to create an instance from the main object and call its methods but its Not the right thing to do! When you create a MFC project, two interfaces are generated automatically and you use them to declare your methods for inbound or outbound calls. One with _D prefix (in my case as _DxPKTB) and one with _D prefix and Events post-fix (_DxPKTBEvents).

When you want to call the Activex methods in c# you have to create an instance from it's interface and then call the methods instead of calling the base object's methods directly!

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

this trick worked for me. Hope to be useful for you too...




回答2:


Visual Studio

Click on TOOLs->OPTIONS->DEBUGGING

Disable just my code(Managed only)

under this Warn if no user code on launch

It's work for me.



来源:https://stackoverflow.com/questions/5650883/catastrophic-failure-when-accessing-an-ocx-library-from-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!