Я получаю различные ошибки, когда пытаюсь запустить очень простой COM-клиент для очень простого COM-сервера, который я написал в C++. COM-сервер написан в C++ и имеет только один метод "GetSomeString". Я построил ocx сервера COM, зарегистрировал его с помощью regsrv32 и ссылался на него из следующего приложения консоли С#:
using MySimpleActivexControlLib;
namespace SimpleConsoleApp
{
class Program
{
static void Main(string[] args)
{
var c = new MySimpleActivexControlLib.MySimpleActivexControl();
c.GetSomeString();
}
}
}
Когда я запускаю код, я получаю следующее исключение:
Необработанное исключение типа "System.Runtime.InteropServices.COMException" произошло в файле mscorlib.dll
Дополнительная информация: Катастрофический сбой (Исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED))
Я попытался использовать компонент из консольного приложения C++ и получил еще одну ошибку:
... Исключение Microsoft C++: _com_error в ячейке памяти 0x002bf5e4...
Полный код можно посмотреть здесь. Любая помощь будет высоко оценен.
Это определенно зависит от того, что внутри элемента управления ActiveX, но вы не указали никакого кода этого.
Например, элемент управления может требовать, чтобы поток STA запускался и размещался надлежащим образом с помощью контейнера, совместимого с ActiveX, что не является вашим тестовым консольным приложением. Попробуйте это из приложения WinForms:
using System;
using System.Windows.Forms;
using AxSimpleActiveXControlLib;
class Program
{
[STAThread]
static void Main()
{
var c = new AxSimpleActiveXControlLib.AxSimpleActiveXControl();
var form = new Form
{
Controls = { c }
};
form.Load += (s, e) => MessageBox.Show(c.GetSomeNumber().ToString());
Application.Run(form);
}
}
Это также может помочь:
Как создать HelloWorld COM Interop в Visual Studio 2012
Обновлено, когда вы добавляете ссылку на элемент управления MFC ActiveX, вы должны либо добавить его через панель инструментов Visual Studio WinForms, либо использовать инструмент AxImp.exe
:
AxImp.exe SimpleActiveXControl.ocx
Таким образом, он будет генерировать AxSimpleActiveXControlLib.dll
и SimpleActiveXControlLib.dll
. Первый будет содержать обертку System.Windows.Forms.Control
-derived для вашего элемента управления ActiveX. Добавьте оба в свой проект, затем попробуйте код, который я разместил выше (обновлен на основе исходного кода, который вы опубликовали).