C # Доступ к родной C ++ DLL - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь создать программу для доступа к собственной C ++ DLL. Ниже приведен пример кода.

C ++ код

GetRmaPin (const char *rma_password, const char *serial, unsigned char *rma_pin);

C # код

class Program
{
    static void Main ( string [ ] args )
    {
        string[] password = { "74f3d3a287cee548c1842c07090d6a274dd0ddbd04bfd1e4694861a369bc7304" };
        string[] serial = { "184393900006" };
        //StringBuilder rma_pin = new StringBuilder(2048);
        byte[] rma_pin = new byte[2048];

        int rc = GetRmaPin(password, serial, ref rma_pin);
        Console.WriteLine ( "Result: " + rc.ToString ( ) );
        Console.WriteLine ( "Payload: " + rma_pin.ToString ( ) );
        Console.Read ( );
    }

    [DllImport ( "Security.dll" , EntryPoint = "GetRmaPin" , CallingConvention = CallingConvention.Cdecl)]
    public static extern int GetRmaPin (
        [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] password ,
        [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] serial ,
        ref byte[] rmap_in );
}

Сообщение об ошибке: Помощник по управляемой отладке 'FatalExecutionEngineError' Сообщение = управляемый помощник по отладке «FatalExecutionEngineError»: «Во время выполнения произошла фатальная ошибка. Адрес ошибки был 0x732dc93d в потоке 0x97a4. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек. '

1 Ответ

0 голосов
/ 22 марта 2019

Я нашел способ получить значение из третьего аргумента после некоторых экспериментов.Вот обновленный код.Спасибо @HansPassant за подсказку по удалению "ref".Надеюсь, это пригодится кому-то в будущем.

class Program
{
    static void Main ( string [ ] args )
    {
        string[] password = { "74f3d3a287cee548c1842c07090d6a274dd0ddbd04bfd1e4694861a369bc7304" };
        string[] serial = { "184393900006" };
        byte[] rma_pin = new byte[32];

        int rc = GetRmaPin(password, serial, rma_pin);

        Console.WriteLine ( "Result: " + rc.ToString ( ) );
        Console.WriteLine ( "Payload: " + BitConverter.ToString ( rma_pin ).Replace ( "-" , "" ) );
        Console.Read ( );
    }

    [DllImport ( "SecurityProduction.dll" , EntryPoint = "GetRmaPin" , CallingConvention = CallingConvention.Cdecl)]
    public static extern int GetRmaPin (
        [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] password ,
        [In][MarshalAs ( UnmanagedType.LPArray , ArraySubType = UnmanagedType.LPStr )] string [ ] serial ,
        byte[] rmap_in );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...