C#访问本机C DLL

C# Access To Native C++ DLL

本文关键字:DLL 本机 访问      更新时间:2023-10-16

我正在尝试创建一个访问本机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 );
}

错误消息:托管调试助理" fatalexecution engineError"消息=托管调试助手" fatalexecution engineError":'运行时遇到了致命的错误。该错误的地址位于线程0x97a4上的0x732DC93D。错误代码为0xC0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证的部分中的错误。此错误的常见来源包括com-Interop或pinvoke的用户编制错误,这可能会损坏堆栈。'

我找到了一种实验后从第三参数获取值的方法。这是更新的代码。感谢@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 );
}