我在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程序集和应用程序中进行更改。
答案 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);
希望能帮到你解决问题! :)