C# 从dll打开端口时未经授权的DaccessException串行端口

C# 从dll打开端口时未经授权的DaccessException串行端口,c#,dll,unauthorizedaccessexcepti,C#,Dll,Unauthorizedaccessexcepti,我在C#中使用System.IO.Ports.SerialPort类。从驻留在不同dll中的my helper类打开串行端口时引发UnAuthorizedAccessException。如果从win表单本身打开端口,则打开端口成功 _portNames = new List<string>(); _portNames.AddRange(SerialPort.GetPortNames()); _serialPort = new SerialPort(); _serialPort.

我在C#中使用System.IO.Ports.SerialPort类。从驻留在不同dll中的my helper类打开串行端口时引发UnAuthorizedAccessException。如果从win表单本身打开端口,则打开端口成功

_portNames = new List<string>(); 
_portNames.AddRange(SerialPort.GetPortNames()); 
_serialPort = new SerialPort(); 
_serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); 
_serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort_ErrorReceived);

var index = 0; 
while (!_serialPort.IsOpen && index < _portNames.Count)
{ 
    try
    { 
        _serialPort.PortName = _portNames[index++]; 
        _serialPort.Open(); 
    } 
    catch (Exception ee) 
    { 
    _logger.Log(ee.Message, EventLogEntryType.Warning); 
    }
} 
\u portNames=new List();
_AddRange(SerialPort.GetPortNames());
_serialPort=新的serialPort();
_serialPort.DataReceived+=新的SerialDataReceiveDevenHandler(serialPort_DataReceived);
_serialPort.ErrorReceived+=新的SerialErrorReceivedEventHandler(serialPort\u ErrorReceived);
var指数=0;
而(!\u serialPort.IsOpen&&index<\u portNames.Count)
{ 
尝试
{ 
_serialPort.PortName=_portNames[index++];
_serialPort.Open();
} 
捕获(异常ee)
{ 
_logger.Log(ee.Message,EventLogEntryType.Warning);
}
} 

COM1上已打开端口


谢谢

当您打开串口时,应始终检查串口是否尚未打开。可能有另一个应用程序打开了COM端口

请在您的
\u serialPort.Open()语句上方尝试此代码:

try
{ 
    _serialPort.PortName = _portNames[index++];

    if (_serialPort.IsOpen)
    {
        MessageBox.Show(string.Concat(_serialPort.PortName, " is already opened by another application!"));
    }
    else
    {
        _serialPort.Open();
    }
}

那是下载的动态链接库吗?不,我已经写了动态链接库。这里是_portNames=new List()_AddRange(SerialPort.GetPortNames())_serialPort=serialPort??新的串行端口()_serialPort.DataReceived+=新的SerialDataReceiveDevenHandler(serialPort_DataReceived)_serialPort.ErrorReceived+=新的SerialErrorReceivedEventHandler(serialPort\u ErrorReceived);我已根据您的评论将您的代码编辑到您的问题中-也许您可以检查是否确定,然后单击问题下方的“编辑”链接以进行更多更改。当端口已在使用时,您会遇到该异常。这可能是另一个在您之前打开端口的进程。最常见的错误是,实际上是您的程序已经打开了它。不要试图在“窗体”和DLL中打开它。您必须将对表单中创建的SerialPort的引用传递给DLL中的代码。此解决方案不起作用。
IsOpen
属性仅用于跟踪实例是否已调用
Open
。它不会检查是否有任何其他应用程序打开了该端口<代码>IsOpen属性跟踪端口是否已打开供调用方使用,而不是跟踪端口是否已由计算机上的任何应用程序打开。