«Катастрофический сбой» при доступе к библиотеке OCX из C # - PullRequest
1 голос
/ 13 апреля 2011

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

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 января 2013

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

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

Я пытался создать экземпляр из моего ocx в c #. объект был успешно создан, но я не смог вызвать его методы с чертовым Катастрофическим Исключением.

 xPKTBLib.xPKTB p = new xPKTBLib.xPKTB()

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

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

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

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

1 голос
/ 12 сентября 2014

Visual Studio

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

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

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

Это работа для меня.

...