.NET 调用c++库注意事项

很久没有更新了,主要还是因为自己懒吧,希望从今天开始坚持至少一周写一篇文章。

 

调用函数库是正常的,调用完成后,在使用EF进行数据更新时,将发生如下异常信息,而且几乎必现。

行库遇到了错误。此错误的地址为 0x79e8eda2,在线程 0xaa4 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。

有时可能会报“读或者写受访问的内存”。而如果在调用前后设置断点,将不会参数异常。

c++ 函数定义

 BOOL WINAPI DataEncryption(const BYTE* pszData, \
         const BYTE* pszDispersionFactor,\
         BYTE** pcResult);

c#调用定义

bool DataEncryption(string encryptData,string dispFactor,ref string result);

如果使用以上定义,调用将发生上面错误,正确的定义应该是

bool DataEncryption(string encryptData,string dispFactor,ref StringBuilder result);

string->StringBuilder即可解决这个问题。

这个问题个人觉得应该是是由于string在.NET中的特殊实现引起的。如果谁知道真正的原因,请帮忙解释一些原因

 

转载于:https://www.cnblogs.com/Oceanchip/p/7092587.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 中调用 C 动态可以通过 P/Invoke(Platform Invocation Services)来实现。P/Invoke 是 .NET Framework 提供的一种机制,用于调用非托管代码。 以下是一个简单的示例,演示如何在 C# 中调用一个 C 动态中的函数: 1. 准备 C 代码 假设我们有一个 C 动态,里面包含一个函数,可以将两个整数相加并返回结果。代码如下: ``` int add(int a, int b) { return a + b; } ``` 2. 准备 C# 代码 在 C# 中,我们需要声明一个 extern 方法,以便能够调用 C 动态中的函数。下面是一个示例: ``` using System; using System.Runtime.InteropServices; class Program { [DllImport("mylib.dll")] public static extern int add(int a, int b); static void Main(string[] args) { int result = add(2, 3); Console.WriteLine("The result is: " + result); } } ``` 在这个示例中,我们使用了 DllImport 属性来声明 add 函数。这个属性告诉 C# 编译器,该函数是在一个名为 "mylib.dll" 的动态中定义的。我们还可以指定函数的参数和返回类型。 在 Main 方法中,我们调用了 add 函数,并将其返回值打印到控制台上。 3. 编译运行 将 C 代码编译为动态 (mylib.dll),然后将 C# 代码编译为可执行文件 (Program.exe)。最后运行可执行文件即可看到结果。 注意事项: - 在 C 代码中,需要添加 extern "C" 声明,以便在动态中导出函数。 - 在 C# 代码中,需要添加 using System.Runtime.InteropServices 命名空间,并使用 DllImport 属性来声明函数。需要注意函数名、参数类型和返回类型的一致性。 - 确保动态 (.dll) 和可执行文件在同一目录下,或者将动态路径添加到环境变量中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值