使用const string& C#导入dll函数作为参数

时间:2016-10-24 09:51:52

标签: c# string dll reference parameter-passing

我在C ++中编写了一个带有C接口的银行系统DLL,其中包含以下用于重命名客户的功能:

int renameCustomer(const string& firstname_, const string& name_, const unsigned int customerId_);

现在我想在.NET程序集中使用该函数。我尝试以这种方式从dll导入函数

    [DllImport("BankManagement.dll", EntryPoint = "renameCustomer", CallingConvention = CallingConvention.Cdecl)]
    public static extern int renameCustomer(ref string firstname_, ref string name_, uint customerId_);

我想在以下函数中使用它:

    public int changeCustomerName(uint id_, string firstname_, string name_)
    {
        return renameCustomer(ref firstname_, ref name_, id_);
    }

在测试应用程序中,我以这种方式调用函数:

BankManageIntern.BankIntern myBankIntern = new BankManageIntern.BankIntern(); 
int checkCust =  myBankIntern.changeCustomerName(0, "Name", "Firstname");

My Logger向我显示无法重命名客户,因为name的输入为空。现在我相信我错误地将字符串传递给函数。我已经尝试了各种方法来传递我在Google上找到的字符串,但没有任何效果。你们有没有想法?客户存在且客户ID有效。我确定不是问题。

一个条件是我可能不会更改DLL的功能。我只能在.NET程序集和应用程序中进行更改。

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

而不是尝试传递字符串,使用指向char的指针。这可以通过使用IntPtr来完成。

private static extern int renameCustomer( IntPtr firstname, IntPtr lastname, uint id);
在您的应用程序中,您可以使用var数据类型。它类似于C ++中的auto_ptr。

var firstnamePtr = Marshal.StringToHGlobalAnsi(firstname);
var lastnamePtr = Marshal.StringToHGlobalAnsi(lastname);

并使用DLL调用您的函数。

var status = renameCustomer(firstnamePtr, lastnamePtr, id);

希望能帮到你解决问题! :)