したがって、私は一生、この NullReferenceError を見つける方法を理解できません。ScannerHelper というプログラムのライブラリを作成しました。唯一の目的は、バーコード リーダーのオンとオフを切り替えることです。それが実行されているプログラムのソースコードにはアクセスできませんが、プログラマーと頻繁に話しているので、私たちは困惑しています。これがセットアップしたトレースです。
痕跡
OpenBarPort: Try Opening Barcode port
ScannerHelper Information: 0 : (0):Open(COM6)+
ScannerHelper Information: 0 : (0):IsValidNewlandScanner(COM6)+
ScannerHelper Information: 0 : (0):HasValidName(COM6)+
ScannerHelper Information: 0 : (0):HasValidName(True)-
ScannerHelper Information: 0 : (0):CheckForNewlandScanner(COM6)+
ScannerHelper Information: 0 : (0):WriteCommand(3F)+
ScannerHelper Information: 0 : (0):WriteCommand()-
ScannerHelper Information: 0 : (0):ReadResponse()+
ScannerHelper Information: 0 : (0):ReadResponse(21)-
ScannerHelper Information: 0 : (0):CheckForNewlandScanner(True)-
ScannerHelper Information: 0 : (0):IsValidNewlandScanner(True)-
ScannerHelper Information: 0 : (0):set_port()+
ScannerHelper Information: 0 : (0):set_port(34786562)-
ScannerHelper Information: 0 : (0):ScannerOn(34786562)+
ScannerHelper Information: 0 : (0):ScannerOn()-
ScannerHelper Information: 0 : (0):Open(OPOS_SUCCESS)-
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
したがって、呼び出された彼のメソッドOpenBarPort
には、try/catch があり、私の ScannerHelper.Open には、すべての try/catch があります。厄介なのは、彼と私の両方の try/catch ステートメントが何もキャッチしないことです。しかし、彼が私の Open Method をコメントアウトすれば、問題は解決します。
これは、わかりやすくするために余分なトレース コードを取り出した Open メソッドのコードです。
public int Open(string portName)
{
if (portName == null)
portName = "";
if (!IsValidNewlandScanner(portName))
return OPOS_E_FAILURE;
try
{
scannerPort = new System.IO.Ports.SerialPort(portName);
scannerPort.DataReceived += scannerPort_DataReceived;
scannerPort.Open();
if (trigger is CPScannerTrigger)
{
//Sets the SafeFileHandle
(trigger as CPScannerTrigger).port = scannerPort;
}
trigger.ScannerOn();
trigger.Opened = true;
}
catch (System.Exception ex)
{
Globals.TraceError(ex);
return OPOS_E_FAILURE;
}
return OPOS_SUCCESS;
}
スキャナートリガー
public override void ScannerOn()
{
Globals.TraceStart(handle.GetHashCode());
CP210xRT_WriteLatch(handle, 4, 0);
Globals.TraceEnd();
}
public override void ScannerOff()
{
Globals.TraceStart(handle.GetHashCode());
CP210xRT_WriteLatch(handle, 4, 4);
Globals.TraceEnd();
}
public System.IO.Ports.SerialPort port
{
set
{
Globals.TraceStart();
handle = GetHandleFromSerialPort(value);
Globals.TraceEnd(handle.GetHashCode());
}
}
private Microsoft.Win32.SafeHandles.SafeFileHandle GetHandleFromSerialPort(System.IO.Ports.SerialPort sp)
{
var BaseStream = sp.BaseStream;
var baseStreamType = BaseStream.GetType();
var flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance;
return baseStreamType.GetField("_handle", flags).GetValue(BaseStream) as Microsoft.Win32.SafeHandles.SafeFileHandle;
}
private Microsoft.Win32.SafeHandles.SafeFileHandle handle;
したがって、このタイプの null 参照エラーは見たことがありません。それがなかったら、2 つのバーコード スキャナーの可能性があるので、SafeFileHandle を静的としてマークするだけです。Open が返された直後にエラーが発生するのは奇妙です。バーコード スキャナーがオンになるので、トリガーが「機能する」ことはわかっていますが、この問題の原因はわかりません。NUnit で単体テストを実行すると、例外がスローされることなく動作します。誰か助けてくれませんか?:) ありがとうございました。