Катастрофический сбой при доступе к библиотеке OCX из C #

В настоящее время я пытаюсь использовать стороннюю DLL из моего приложения C #. Я зарегистрировал DLL и добавил ее как ссылку из списка компонентов COM. Насколько я понимаю, это должно создать необходимые классы взаимодействия для доступа к этой DLL из C #.

При попытке вызвать какие-либо методы из 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 (для которого я видел ряд решений, позволяющих устранить эту проблему).

Есть ли у кого-нибудь идеи относительно того, где я ошибаюсь?

Спасибо


person Adam    schedule 13.04.2011    source источник
comment
Я тоже бился головой о Catastrophic failure (WTF? Нас ударил метеорит ?!), но моя ошибка появляется и исчезает случайным образом. Запуск проекта 10 раз подряд (без правок и перекомпиляций) выдает ошибку примерно два раза. Кто знает ...: |   -  person Albireo    schedule 13.04.2011
comment
Это странно. Элементы управления часто возвращают E_UNEXPECTED, когда вызываются в неправильном потоке, но не похоже, что у вас здесь какая-то странная логика потоковой передачи. Я бы позвонил этой третьей стороне и спросил, знакомы ли они с проблемой.   -  person Eric Lippert    schedule 13.04.2011
comment
У нас раньше были эти проблемы с очень старыми устаревшими API сторонних разработчиков, нам всегда приходилось связываться с поставщиком и заставлять его отсортировать его, без исходного кода это очень сложно узнать ..   -  person Richard Friend    schedule 13.04.2011
comment
Работаете на Windows 7? Я обнаружил, что одна из моих устаревших библиотек отказывается работать с включенным DEP. Попробуйте bcdedit.exe {current} / set nx alwaysoff, чтобы понять, ваша проблема в этом или нет.   -  person jasonh    schedule 14.04.2011
comment
Эрик - Ага, многопоточность не задействована. Это было простое консольное приложение, чтобы попытаться заставить библиотеку работать. Джейсон - Я занимаюсь разработкой на Windows XP. Всем спасибо за предложения и мысли. Решил написать свою реализацию библиотеки. Это будет быстрее, чем ждать, пока поставщик попытается исправить то, что когда-либо идет не так.   -  person Adam    schedule 14.04.2011


Ответы (2)


Решено для меня!

У меня была такая же проблема около двух недель !!!

Я пытался создать экземпляр из моего ocx на С #. объект был успешно создан, но мне не удалось вызвать его методы с чертовым Catastrophic Exception.

 xPKTBLib.xPKTB p = new xPKTBLib.xPKTB()

Как вы видите, я пытался создать экземпляр из основного объекта и вызвать его методы, но это неправильно! При создании проекта MFC автоматически создаются два интерфейса, и вы используете их для объявления своих методов для входящих или исходящих вызовов. Один с префиксом _D (в моем случае как _DxPKTB) и один с префиксом _D и пост-исправлением событий (_DxPKTBEvents).

Если вы хотите вызвать методы Activex в C #, вам нужно создать экземпляр из его интерфейса, а затем вызвать методы вместо прямого вызова методов базового объекта!

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

у меня этот трюк сработал. Надеюсь быть полезным и для вас ...

person Mehrdad    schedule 21.01.2013

Visual Studio

Нажмите ИНСТРУМЕНТЫ-> ОПЦИИ-> ОТЛАДКА.

Отключить только мой код (только управляемый)

под этим предупреждением, если нет кода пользователя при запуске

Для меня это работа.

person Prabu    schedule 12.09.2014