VS2012でC#言語でDLL(C書き込み)を呼び出しています。mylib.dll は C# で呼び出すネイティブ dll であり、mylib.dll は別の mylib_another.dll も呼び出します。
C 関数の宣言は次のとおりです。
extern DECLSPEC_DLL BOOLEAN_TYPE SetConnection(char *dev, char *addr);
My C# file で、次のように宣言します。
[DllImport("C:\\mylib.dll", EntryPoint = "SetConnection", CharSet = CharSet.Auto)]
public static unsafe extern int SetConnection(StringBuilder dev, StringBuilder addr);
コードで呼び出すと、文字列が 1 文字しか渡されないことがわかりました。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 Exception が発生します。
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.
それについてのアイデアはありますか?
以下のように解決しました(答えは最初の質問、2番目の質問に対するものです。これは、mylib.dllが別のネイティブdllを呼び出し、システムがそれを見つけられなかったためです)。
同様の問題がここにあります: