C# .NET DLL gibt den Dateizugriff ab, der bei der aufgerufenen Anwendung von Drittanbietern aufgerufen wurde [geschlosseC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 C# .NET DLL gibt den Dateizugriff ab, der bei der aufgerufenen Anwendung von Drittanbietern aufgerufen wurde [geschlosse

Post by Anonymous »

Ich verwende eine SCADA -Software (Aveva Intouch HMI), die das Import von .NET -Bibliotheken als .dll -Dateien unterstützt, um schnellere benutzerdefinierte Funktionen in ihrer Skriptumgebung zu verwenden (ich glaube, sie unterstützen vb.net; Ich habe C# verwendet und es in eine .NET -DLL -Bibliothek zusammengestellt. Es funktioniert einwandfrei, bis ich versuche, dieselbe Datei zu lesen, die die SCADA -Laufzeit verwendet, um historische Daten zu protokollieren. Sobald die SCADA -Software nicht mehr in dieser Datei angemeldet ist, kann ich auf ihre Inhalte zugreifen und lesen. Das Seltsame ist jedoch, dass ich dieselbe Datei mit Notepad (einem externen Prozess) öffnen kann. Aber wenn ich versuche, es mit einem ausgelösten Skript aus der SCADA -Laufzeit selbst zu öffnen, erhalte ich die folgende Ausnahme: < /p>

Der Vorgang kann nicht auf die Datei zugreifen, da er von einem anderen Vorgang verwendet wird. Gibt es eine Problemumgehung? Ich muss diese Datei mit meinen externen Bibliotheken öffnen, um eine kritische Analyse durchzuführen. Wenn ich jedoch versuche, es aus einem ausgelösten Skript zu öffnen - zum Beispiel durch Klicken auf einen Pushbutton -, wird eine Ausnahme ausgelöst. < /P>

Code: Select all

/*C# Code:************************************************/

public class IntResult
{
public string ErrorMessage { get; internal set; }
public int Result { get; internal set; }
}

public static class LGHFile
{
// This pattern mark the start of every block in the log file
readonly private static byte[] _blockStartPattern = new byte[] { 0xBC, 0x1B, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x70, 0xB6, 0x32, 0x07, 0x70, 0x33, 0xDC, 0x01};

public static IntResult FindPattern(int startSearch, string path)
{
IntResult intResult = new IntResult();
intResult.Result = -1;
intResult.ErrorMessage = "No Error";

FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);

try
{
byte[] data = new byte[1000000];
fileStream.Read(data, 0, 1000000);

int patternAddress = -1;

for (int i = startSearch; i < data.Length - _blockStartPattern.Length + 1; i++)
{
bool found = true;

for (int j = 0; j < _blockStartPattern.Length; j++)
{
if (data[i + j] != _blockStartPattern[j])
{
found = false;
break;
}

}

if (found)
{
patternAddress = i;
break;
}
}

intResult.Result = patternAddress;

fileStream.Close();
}
catch (System.Exception ex)
{
intResult.ErrorMessage = ex.Message;

fileStream.Close();
}

return intResult;

}
}
< /code>
Dies ist der SCADA -Code: < /p>
// SCADA Script Execute when click on the push
dim result as VAInTouchTools.Wrapper.IntResult;

result = VAInTouchTools.Wrapper.LGHFile.FindPattern(VA_INT_TAG_NUMBER_09, "E:\\Projects\\TopNav_004\\25100500.lgh");

VA_INT_TAG_NUMBER_10 = result.Result;

TextBox1.Text = result.ErrorMessage;

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post