Pergunta

Eu tenho um objeto COM que estou tentando agrupar em uma classe C# para torná-lo mais disponível para outros aplicativos que desejam consumi-lo.

Eu tenho o seguinte código que cria uma instância do objeto COM e, em seguida, usando a reflexão, faz uma chamada para um método para recuperar os dados do usuário.Este código funciona bem quando está localizado em uma página aspx.

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

No entanto, quando movo o código para um arquivo de classe (JD_API.cs) para abstraí-lo do site real, não consigo mais fazê-lo funcionar.Por exemplo, tenho o seguinte método estático declarado assim:

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;
}

Infelizmente, o objeto Servidor está restrito a algumas bibliotecas ASP.NET incluídas por padrão em aplicativos da Web e, portanto, o código acima foi proibido.Então, neste ponto, decidi tentar criar uma instância do objeto COM assim:

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;
}

No entanto, em tempo de execução, recebo um erro que diz: "Tentativa de ler ou gravar memória protegida.Muitas vezes, isso é uma indicação de que outra memória está corrompida.".

Não tenho certeza para onde ir a partir daqui.Qualquer ajuda sobre como abstrair a criação de uma instância deste objeto COM para uma camada que não esteja dentro do próprio aplicativo da web seria muito apreciada.Obrigado!!

Foi útil?

Solução

Declare funções DLL dentro de uma classe.Em seguida, defina um método estático para cada função DLL que você deseja chamar.O exemplo de código a seguir cria um wrapper chamado Win32MessageBox que chama a função MessageBox em User32.dll sempre que um aplicativo .NET chama o método Show do objeto.Ele requer o namespace 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);
    }
}

Para chamá-lo, basta digitar:

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

O método onde você chama a linha acima não precisa estar ciente de que na verdade está chamando uma função em uma DLL não gerenciada.

Recursos:o Kit de treinamento individualizado MCTS (Exame 70-536) de Tony Northrup.

Outras dicas

Você já tentou usar interoperacional

Eu fiz o seguinte no passado (trabalhando de memória, então talvez você precise mexer um pouco nisso):

  1. Clique com o botão direito em "Referências" no seu projeto
  2. Selecione "Adicionar Referência"
  3. Selecione a guia "Com"
  4. Encontre e adicione sua instância Com

No seu arquivo de classe

using yourComName;

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

Espero que isso a) funcione eb) ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top