我用C++编写了一个银行系统DLL,它的C接口具有以下函数,用于重命名客户:
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");我的Logger告诉我,由于名称的输入是空的,所以无法重命名客户。现在,我相信我犯了一个错误,把字符串传递给函数。我已经尝试过各种方法来传递字符串,这是我在Google上找到的,但是没有任何效果。你们中有谁有主意吗?客户存在且客户id有效。我肯定这不是问题所在。
一个条件是,我不能更改DLL的函数。我只能在.NET程序集和应用程序中进行更改。
发布于 2016-10-29 13:41:28
尝试以下几点:
不要试图传递字符串,而是使用指向字符的指针。这可以通过使用IntPtr来完成。
private static extern int renameCustomer( IntPtr firstname, IntPtr lastname, uint id);在应用程序中,可以使用var数据类型。它类似于auto_ptr in C++。
var firstnamePtr = Marshal.StringToHGlobalAnsi(firstname);
var lastnamePtr = Marshal.StringToHGlobalAnsi(lastname);并从DLL中调用该函数。
var status = renameCustomer(firstnamePtr, lastnamePtr, id);希望这能帮助你解决问题!)
https://stackoverflow.com/questions/40215388
复制相似问题