首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有const &作为参数的C#导入dll函数

问带有const &作为参数的C#导入dll函数
EN

Stack Overflow用户
提问于 2016-10-24 09:51:51
回答 1查看 457关注 0票数 0

我用C++编写了一个银行系统DLL,它的C接口具有以下函数,用于重命名客户:

代码语言:javascript
复制
int renameCustomer(const string& firstname_, const string& name_, const unsigned int customerId_);

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

代码语言:javascript
复制
    [DllImport("BankManagement.dll", EntryPoint = "renameCustomer", CallingConvention = CallingConvention.Cdecl)]
    public static extern int renameCustomer(ref string firstname_, ref string name_, uint customerId_);

我想在以下功能中使用它:

代码语言:javascript
复制
    public int changeCustomerName(uint id_, string firstname_, string name_)
    {
        return renameCustomer(ref firstname_, ref name_, id_);
    }

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

代码语言:javascript
复制
BankManageIntern.BankIntern myBankIntern = new BankManageIntern.BankIntern(); 
int checkCust =  myBankIntern.changeCustomerName(0, "Name", "Firstname");

我的Logger告诉我,由于名称的输入是空的,所以无法重命名客户。现在,我相信我犯了一个错误,把字符串传递给函数。我已经尝试过各种方法来传递字符串,这是我在Google上找到的,但是没有任何效果。你们中有谁有主意吗?客户存在且客户id有效。我肯定这不是问题所在。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-29 13:41:28

尝试以下几点:

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

代码语言:javascript
复制
private static extern int renameCustomer( IntPtr firstname, IntPtr lastname, uint id);

在应用程序中,可以使用var数据类型。它类似于auto_ptr in C++。

代码语言:javascript
复制
var firstnamePtr = Marshal.StringToHGlobalAnsi(firstname);
var lastnamePtr = Marshal.StringToHGlobalAnsi(lastname);

并从DLL中调用该函数。

代码语言:javascript
复制
var status = renameCustomer(firstnamePtr, lastnamePtr, id);

希望这能帮助你解决问题!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40215388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档