Как использовать COM-объект в файле класса ASP.NET

У меня есть COM-объект, который я пытаюсь обернуть в класс C#, чтобы сделать его более доступным для других приложений, которые хотят его использовать.

У меня есть следующий код, который создает экземпляр COM-объекта, а затем с помощью отражения вызывает метод для извлечения пользовательских данных. Этот код отлично работает, когда он находится на странице aspx.

object jdObj = Server.CreateObject("jd_api.UserCookie");
string username = jdObj.GetType().InvokeMember("GetUserName", System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString();

Однако когда я перемещаю код в файл класса (JD_API.cs), чтобы абстрагировать его от фактического веб-сайта, я больше не могу заставить его работать. Например, у меня есть следующий статический метод, который объявлен так:

public static string GetUserName() {

    object jdObj = Server.CreateObject("jd_api.UserCookie");
    string username = jdObj.GetType().InvokeMember("GetUserName",
System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString();

    return username;
}

К сожалению, объект Server ограничен некоторыми библиотеками ASP.NET, которые по умолчанию включены в веб-приложения, поэтому приведенный выше код не годился. Итак, в этот момент я решил попытаться создать экземпляр COM-объекта следующим образом:

public static string GetUserName() {

    Type type = Type.GetTypeFromProgID("jd_api.UserCookie");
    object jdObj = Activator.CreateInstance(type);

    string username = jdObj.GetType().InvokeMember("GetUserName", System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString();

    return username;
}

Однако во время выполнения я получаю сообщение об ошибке "Попытка чтения или записи в защищенную память. Часто это указывает на то, что другая память повреждена.".

Я не уверен, куда идти отсюда. Будем очень признательны за любую помощь в том, как абстрагировать создание экземпляра этого COM-объекта на уровень, который не находится в самом веб-приложении. Спасибо!!


person Jagd    schedule 30.03.2011    source источник


Ответы (2)


Объявите функции DLL внутри класса. Затем определите статический метод для каждой функции DLL, которую вы хотите вызвать. В следующем примере кода создается оболочка с именем Win32MessageBox, которая вызывает функцию MessageBox в User32.dll каждый раз, когда приложение .NET вызывает метод Show объекта. Для этого требуется пространство имен System.Runtime.InteropServices.

using System;
using System.Runtime.InteropServices;

class Win32MessageBox
{
    [DllImport("user32.dll")]
    private static extern int MessageBox(IntPtr hWnd, String text,
        String caption, uint type);

    public static void Show(string message, string caption)
    {
        MessageBox(new IntPtr(0), message, caption, 0);
    }
}

Чтобы вызвать его, просто введите:

Win32MessageBox.Show("StackOverflow!", "my stack box");

Метод, в котором вы вызываете приведенную выше строку, не должен знать, что он фактически вызывает функцию в неуправляемой библиотеке DLL.

Ресурсы: набор для самостоятельного обучения MCTS (экзамен 70-536) Тони Нортрапа.

person Roberto Alarcon    schedule 30.03.2011

Как вы пытались использовать взаимодействие

Я сделал следующее в прошлом (работая по памяти, поэтому вам может понадобиться немного поиграть с этим):

  1. Щелкните правой кнопкой мыши «Ссылки» в вашем проекте.
  2. Выберите «Добавить ссылку»
  3. Выберите вкладку «Com»
  4. Найдите и добавьте свой Com Instnace

В вашем файле класса

using yourComName;

public static string GetUserName() 
{
        yourComName.yourComClass jdObj = new  yourComClass();
        string username = jdObj.GetUserName(someParameters);
        return username;
}

Надеюсь, это а) работает и б) помогает!

person Jon P    schedule 30.03.2011