C# 调用 C DLL,通行证 char * 作为参数不正确

标签: dll C#
发布时间: 2013/12/8 11:23:21
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我在 C# 语言中在 VS2012 打电话 DLL(C write)。mylib.dll 是我要在 C# 中调用的本机 dll 和 mylib.dll 还将调用另一个 mylib_another.dll 也。

C 函数声明为:

extern DECLSPEC_DLL BOOLEAN_TYPE SetConnection(char *dev, char *addr); 

在我的 C# 文件中,我宣布它作为:

[DllImport("C:\\mylib.dll", EntryPoint = "SetConnection", CharSet = CharSet.Auto)]
public static unsafe extern int SetConnection(StringBuilder  dev,  StringBuilder addr);

我叫它在代码中,我发现时传递的字符串只有一个字符,当我通过 dev"USB"、 本机 DLL 只得到一个"U"实际上。

如果更改到宣言:

[DllImport("C:\\mylib.dll", EntryPoint = "SetConnection", CharSet = CharSet.Ansi)]
public static unsafe extern int SetConnection(StringBuilder  dev,  StringBuilder addr);

然后,它将引发 System.AccessViolationException 异常:

System.Reflection.TargetInvocationException was unhandled
HResult=-2146232828
Message=Exception has been thrown by the target of an invocation.
Source=mscorlib
StackTrace:
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   at QC.QTMDotNetKernel.DotNetKernel.RunDotNetTest(Object stateObject)
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
InnerException: System.AccessViolationException
   HResult=-2147467261
   Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

对此有何建议?

已经解决了如下所示 (答案是第一个问题,第二个,这是因为 mylib.dll 调用另一个本机 dll 和系统没有找到它)。

类似问题在这里:

解决方法 1:

当你那样只能接收一个字符时,它通常是指将 Unicode (UTF16) 的字符串传递给正在等 8 位的格式 (如 ASCII、 UTF8 或 ANSI C/c + + 函数。

16 位 Unicode 格式结束了一个字节设置为零,字符在 ASCII/ANSI 的范围,其两个字节的因为 C/c + + 程序将一个零字节视为结束的字符串中的字符,它会截断字符串。

很容易,请尝试使用 ANSI 看到是否它会帮助 ;更改

CharSet = CharSet.Auto

CharSet = CharSet.Ansi
赞助商