Как использовать COM-объект в файле класса ASP.NET - PullRequest
1 голос
/ 31 марта 2011

У меня есть 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-объекта в слой, который не находится внутри самого веб-приложения, будет принята с благодарностью.Спасибо !!

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Объявление функций 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) Тони Нортрупа.

0 голосов
/ 31 марта 2011

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

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

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

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

using yourComName;

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

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

...