Fórum Tanca Fóruns SAT Fiscal TS-1000 e SDK-1000 Problemas ao importar SAT.dll C#

Marcado: , ,

Este tópico contém respostas, possui 4 vozes e foi atualizado pela última vez por Robinson Soares Robinson Soares 7 anos, 9 mes atrás.

Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #132

    dstecdiego
    Participante

    Olá pessoal, estou tendo problemas ao importar a dll, programo em C# e toda vez que chamo qualquer função da DLL ele me retorna erro, fiz um teste com o emulador gratuito da sefaz, o comando é recebido com sucesso pelo emulador, mas o retorno da erro no sistema.
    Alguém tem alguma idéia do que pode ser?

    #133

    Rodrigo R. Muniz
    Participante

    Boa Tarde, Diego

    Se voce informar qual o erro, ou a mensagem dele, e como vc esta fazendo o DLLImport, fica mais facil

    Rodrigo

    #134

    dstecdiego
    Participante

    [DllImport(“SAT.dll”, CallingConvention = CallingConvention.Cdecl)]
    public static extern string TesteFimAFim(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao, [MarshalAs(UnmanagedType.LPStr)] string DadosVenda);

    string retorno = TesteFimAFim(sessao, “12345678”, XML);

    e sempre da erro de system.accessviolationexception tentativa de leitura ou gravação em memória protegida.

    #135

    Rodrigo R. Muniz
    Participante

    Boa Tarde, Diego

    faça assim:

    [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
    private static extern IntPtr TesteFimAFim(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,[MarshalAs(UnmanagedType.LPStr)] string dadosVenda);

    na logica:

    IntPtr ptr = TesteFimAFim(iNumeroSessaoAC, strCodigoAtivacao, strDadosVenda);
    string strStatus = Marshal.PtrToStringAnsi(ptr);

    Espero q ajude

    Rodrigo

    #136

    dstecdiego
    Participante

    deu certo!!! valeu!

    #152

    Carlos Abreu Jr
    Participante

    rodrigormuniz, como setar dll dinamicamente strSATDLL?

    não tem idéia de como estava apanhando com isso.. obrigado mesmo.

    #154

    Rodrigo R. Muniz
    Participante

    Boa Tarde, Carlos

    Desculpe, não havia mais acessado o forum.

    Declare uma classe assim:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;

    static class NativeMethods
    {
    [DllImport(“kernel32.dll”)]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport(“kernel32.dll”)]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport(“kernel32.dll”)]
    public static extern bool FreeLibrary(IntPtr hModule);
    }

    na sua classe de implementação:

    static IntPtr dllHandle;
    //
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate IntPtr ConsultarStatusOperacional(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao);
    //

    e na sua lógica:

    string strSATDLL_PARAMETRIZADO = “SAT_OUTRO.dll”;
    string strSATDLL = string.Empty;
    if (strMsg.ToLower().Equals(“tanca”))
    {
    strSATDLL = “SAT.dll”;
    }
    else
    {
    strSATDLL = strSATDLL_PARAMETRIZADO;
    }
    IntPtr ptr = NativeMethods.LoadLibrary(strSATDLL);
    IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(ptr, “ConsultarStatusOperacional”);
    ConsultarStatusOperacional consultaSat = (ConsultarStatusOperacional)Marshal.GetDelegateForFunctionPointer(
    pAddressOfFunctionToCall,
    typeof(ConsultarStatusOperacional));
    strStatus = Marshal.PtrToStringAnsi(consultaSat(iNumeroSessaoAC, strCodigoAtivacao));

    A condição acima, é logica de exemplo. É obvio que sua intenção é parametrizar a chamada.
    Mas, embora o Sefaz tenha recomendado a padronização da Sat.dll, os fabricantes seguiram a especificação somente nos entrypoints da mesma ( metodos ). Mas, na definição dos parametros destes metodos, o seguiram somente em quantidade de parametros, não em sua especificação. Assim, o numero da sessão é inteiro para um fabricante, em outro, deve ser passado como string, mas em seu conteudo como inteiro. Desta forma, voce ate consegue parametrizar a dll de chamada, mas deve tomar cuidado com a passagem dos parametros ao metodo chamado.

    Se ajudou, propague, se tiver uma solução, auxilie, propague, divulgue.

    ATT

    Rodrigo

    #525
    Robinson Soares
    Robinson Soares
    Participante

    Bom dia Rodrigo Muniz,

    Sobre acessar a DLL dinamicamente vc teria um exemplo para me enviar por e-mail?

    grato

Visualizando 8 posts - 1 até 8 (de 8 do total)

Você deve fazer login para responder a este tópico.