我有一个VB.NET应用程序似乎在VS2012 IDE中完美运行。它处理数千条记录。当我将其编译为发布时,它将处理随机数量的记录(< 200)并且使用"对象引用未设置为对象的实例。"
它总是在我调用的外部C ++ DLL中死掉,它也会回调我的代码。来自非托管代码的回调需要使用委托。我不熟悉代表们以前从未使用它们的复杂性。
在我的研究中,我注意到它们用于启动多线程。是否有可能无意中使我的应用程序多线程化?
这是我正在使用的语法;
Public Delegate Sub EditsMessagerHandlerDelegate(ByRef objThis As IntPtr, _
ByVal strEditTag As String, _
ByVal strEditName As String, _
ByVal strAdminCode As String, _
ByVal strErrorType As String, _
ByVal strMessage As String)
Dim objEditsMessagerHandler As New EditsMessagerHandlerDelegate(AddressOf EditsMessagerHandler)
Dim ptrEditsMessagerHandler As IntPtr = Marshal.GetFunctionPointerForDelegate(objEditsMessagerHandler)
Edit_RunEdits(_intsmfID, _strEditSetTag, _strEditLayoutTag, strNAACCRRecord, _
EE_NOSKIP, intErrCount, ptrThis, ptrEditsMessagerHandler)
我的问题;
这会导致应用程序出现多线程吗?
无意中多线程的应用会导致我遇到的错误吗?
如何强制它在同一个线程中运行?
我无法控制C ++ DLL,也无法查看源代码。
修改
这不是关于"对象引用未设置为对象实例的问题。"这是一个关于使用p / invoke是否会无意中导致多线程的问题。
我已阅读链接文章以及许多其他文章,并且所提出的问题似乎都不适用。请不要因为你认为提出错误的问题而不得不重复。如果您对我的具体问题有答案,请回复。
我被要求发布问题的堆栈跟踪,就在这里;
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at ACE.OraEditsLib50.processRecord(String strInterRecordEditsName, OracleConnection objConnection) in I:\FCDSApps\OraEditsLib50\OraEditsLib50\OraEditsLib50.vb:line 299
有趣的是,299行不是它执行的最后一行VB行。我已经验证了在该行的另一个类中的函数调用以及另外10-15行代码一直执行,直到它调用C ++ DLL。 再次编辑
虽然"重复"上面的消息没有解决我的问题,我的程序所遇到的问题与多线程无关。
我在类中的方法中的局部变量中定义了我的委托的对象和指针。我没有妥善处理这些物品。退出类中的方法之前的指针。为了解决这个问题,我将这些对象移到了#34; private"变量,因为它们在实例化的类的生命周期中永远不会改变,我的问题就消失了。
其他成员之一(我会提到他的名字,但他可能不希望别人认为他会提供他提供给我的帮助)这里实际上查看了我的一些代码并提出修复问题的建议。 / p>