Vorbereitung der Verwendung von SFTP aus dem Dakosy Projekt
This commit is contained in:
parent
fe2db2fa6b
commit
ca58d091c5
80
bsmd.dakosy/Properties/Settings.Designer.cs
generated
80
bsmd.dakosy/Properties/Settings.Designer.cs
generated
@ -13,7 +13,7 @@ namespace bsmd.dakosy.Properties {
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
@ -23,123 +23,75 @@ namespace bsmd.dakosy.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("dakosy")]
|
||||
public string SFTPSessionName {
|
||||
get {
|
||||
return ((string)(this["SFTPSessionName"]));
|
||||
}
|
||||
set {
|
||||
this["SFTPSessionName"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("c:\\temp\\sftp_log.xml")]
|
||||
public string SFTPLog {
|
||||
get {
|
||||
return ((string)(this["SFTPLog"]));
|
||||
}
|
||||
set {
|
||||
this["SFTPLog"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("e:\\temp\\dakosy\\out")]
|
||||
public string SFTPOutDir {
|
||||
get {
|
||||
return ((string)(this["SFTPOutDir"]));
|
||||
}
|
||||
set {
|
||||
this["SFTPOutDir"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("e:\\temp\\dakosy\\in")]
|
||||
public string SFTPInDir {
|
||||
get {
|
||||
return ((string)(this["SFTPInDir"]));
|
||||
}
|
||||
set {
|
||||
this["SFTPInDir"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool TestMode {
|
||||
get {
|
||||
return ((bool)(this["TestMode"]));
|
||||
}
|
||||
set {
|
||||
this["TestMode"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("E:\\Tools\\WinScp\\WinSCP.com")]
|
||||
public string WINSCPFullPath {
|
||||
get {
|
||||
return ((string)(this["WINSCPFullPath"]));
|
||||
}
|
||||
set {
|
||||
this["WINSCPFullPath"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("in/prod/ed02")]
|
||||
public string RemoteProdIncomingDir {
|
||||
public string RemoteIncomingDir {
|
||||
get {
|
||||
return ((string)(this["RemoteProdIncomingDir"]));
|
||||
}
|
||||
set {
|
||||
this["RemoteProdIncomingDir"] = value;
|
||||
return ((string)(this["RemoteIncomingDir"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("in/test/ed02")]
|
||||
public string RemoteTestIncomingDir {
|
||||
get {
|
||||
return ((string)(this["RemoteTestIncomingDir"]));
|
||||
}
|
||||
set {
|
||||
this["RemoteTestIncomingDir"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("out/prod")]
|
||||
public string RemoteProdOutgoingDir {
|
||||
public string RemoteOutgoingDir {
|
||||
get {
|
||||
return ((string)(this["RemoteProdOutgoingDir"]));
|
||||
}
|
||||
set {
|
||||
this["RemoteProdOutgoingDir"] = value;
|
||||
return ((string)(this["RemoteOutgoingDir"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("out/test")]
|
||||
public string RemoteTestOutgoingDir {
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool TestMode {
|
||||
get {
|
||||
return ((string)(this["RemoteTestOutgoingDir"]));
|
||||
}
|
||||
set {
|
||||
this["RemoteTestOutgoingDir"] = value;
|
||||
return ((bool)(this["TestMode"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,35 +2,29 @@
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="bsmd.dakosy.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="SFTPSessionName" Type="System.String" Scope="User">
|
||||
<Setting Name="SFTPSessionName" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">dakosy</Value>
|
||||
</Setting>
|
||||
<Setting Name="SFTPLog" Type="System.String" Scope="User">
|
||||
<Setting Name="SFTPLog" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">c:\temp\sftp_log.xml</Value>
|
||||
</Setting>
|
||||
<Setting Name="SFTPOutDir" Type="System.String" Scope="User">
|
||||
<Setting Name="SFTPOutDir" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">e:\temp\dakosy\out</Value>
|
||||
</Setting>
|
||||
<Setting Name="SFTPInDir" Type="System.String" Scope="User">
|
||||
<Setting Name="SFTPInDir" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">e:\temp\dakosy\in</Value>
|
||||
</Setting>
|
||||
<Setting Name="TestMode" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="WINSCPFullPath" Type="System.String" Scope="User">
|
||||
<Setting Name="WINSCPFullPath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">E:\Tools\WinScp\WinSCP.com</Value>
|
||||
</Setting>
|
||||
<Setting Name="RemoteProdIncomingDir" Type="System.String" Scope="User">
|
||||
<Setting Name="RemoteIncomingDir" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">in/prod/ed02</Value>
|
||||
</Setting>
|
||||
<Setting Name="RemoteTestIncomingDir" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">in/test/ed02</Value>
|
||||
</Setting>
|
||||
<Setting Name="RemoteProdOutgoingDir" Type="System.String" Scope="User">
|
||||
<Setting Name="RemoteOutgoingDir" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">out/prod</Value>
|
||||
</Setting>
|
||||
<Setting Name="RemoteTestOutgoingDir" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">out/test</Value>
|
||||
<Setting Name="TestMode" Type="System.Boolean" Scope="Application">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@ -155,8 +155,7 @@ namespace bsmd.dakosy
|
||||
}
|
||||
break;
|
||||
case Message.NotificationClass.NOA_NOD:
|
||||
bsmd.database.NOA_NOD noa_nod = aMessage.Elements[0] as bsmd.database.NOA_NOD;
|
||||
if (noa_nod == null) throw new ApplicationException("dbEntity is no NOA_NOD message!");
|
||||
if (!(aMessage.Elements[0] is bsmd.database.NOA_NOD noa_nod)) throw new ApplicationException("dbEntity is no NOA_NOD message!");
|
||||
vList.Visit[0].NOA_NOD = new NOA_NOD();
|
||||
//vList.Visit[0].NOA_NOD.CallPurpose
|
||||
vList.Visit[0].NOA_NOD.EtaToKielCanalSpecified = noa_nod.ETAToKielCanal.HasValue;
|
||||
@ -800,7 +799,7 @@ namespace bsmd.dakosy
|
||||
if (!serializationFailed)
|
||||
{
|
||||
// call sftp client to send
|
||||
sftp.Put(fileName, Properties.Settings.Default.RemoteProdIncomingDir);
|
||||
SFtp.Put(fileName, Properties.Settings.Default.RemoteIncomingDir);
|
||||
}
|
||||
|
||||
File.Delete(fileName);
|
||||
@ -865,12 +864,10 @@ namespace bsmd.dakosy
|
||||
}
|
||||
|
||||
// call sftp client to send
|
||||
sftp.Put(fileName,
|
||||
Properties.Settings.Default.TestMode ?
|
||||
Properties.Settings.Default.RemoteTestIncomingDir : Properties.Settings.Default.RemoteProdIncomingDir);
|
||||
SFtp.Put(fileName, Properties.Settings.Default.RemoteIncomingDir);
|
||||
|
||||
// remove sent file if not test mode
|
||||
if (!Properties.Settings.Default.TestMode)
|
||||
// if (!Properties.Settings.Default.TestMode)
|
||||
File.Delete(fileName);
|
||||
|
||||
}
|
||||
|
||||
@ -21,20 +21,17 @@ using bsmd.database;
|
||||
|
||||
namespace bsmd.dakosy
|
||||
{
|
||||
public class Response
|
||||
public static class Response
|
||||
{
|
||||
private static ILog _log = LogManager.GetLogger(typeof(Request));
|
||||
private static readonly ILog _log = LogManager.GetLogger(typeof(Request));
|
||||
|
||||
public static void ReadAll()
|
||||
{
|
||||
// SFTP verbindung öffnen und alle Dateien herunterladen
|
||||
|
||||
string localDir = Properties.Settings.Default.SFTPInDir;
|
||||
string remoteDir = Properties.Settings.Default.RemoteOutgoingDir;
|
||||
|
||||
string remoteDir = Properties.Settings.Default.TestMode ?
|
||||
Properties.Settings.Default.RemoteTestOutgoingDir : Properties.Settings.Default.RemoteProdOutgoingDir;
|
||||
|
||||
sftp.GetAll(remoteDir);
|
||||
SFtp.GetAll(remoteDir);
|
||||
|
||||
// lokale Dateien verarbeiten
|
||||
foreach (string inputFile in Directory.GetFiles(localDir))
|
||||
@ -48,7 +45,7 @@ namespace bsmd.dakosy
|
||||
File.Delete(inputFile); // alternativ: move to archive folder
|
||||
}
|
||||
// remote Dateien löschen
|
||||
sftp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile));
|
||||
SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile));
|
||||
}
|
||||
}
|
||||
|
||||
@ -70,13 +67,11 @@ namespace bsmd.dakosy
|
||||
eDeclarationMessageInterchangeBodyEdiResponseList responseList = eDeclaration.InterchangeBody.Item as eDeclarationMessageInterchangeBodyEdiResponseList;
|
||||
foreach(EdiResponse ediResponse in responseList.EdiResponse)
|
||||
{
|
||||
|
||||
Guid localReferenceId, messageReferenceId;
|
||||
if (!Guid.TryParseExact(ediResponse.LocalReferenceNumber, "N", out localReferenceId))
|
||||
if (!Guid.TryParseExact(ediResponse.LocalReferenceNumber, "N", out Guid localReferenceId))
|
||||
{
|
||||
_log.ErrorFormat("unable to parse local reference number {0}", ediResponse.LocalReferenceNumber);
|
||||
}
|
||||
if (!Guid.TryParseExact(ediResponse.PreviousMessageNumber, "N", out messageReferenceId))
|
||||
if (!Guid.TryParseExact(ediResponse.PreviousMessageNumber, "N", out Guid messageReferenceId))
|
||||
{
|
||||
_log.ErrorFormat("unable to parse message reference id {0}", ediResponse.MessageHeader.MessageReferenceNumber);
|
||||
}
|
||||
@ -126,8 +121,8 @@ namespace bsmd.dakosy
|
||||
foreach (ResponseError responseError in ediResponse.Errors)
|
||||
{
|
||||
MessageError messageError = new MessageError();
|
||||
int errCode;
|
||||
if (Int32.TryParse(responseError.ErrorCode, out errCode))
|
||||
|
||||
if (Int32.TryParse(responseError.ErrorCode, out int errCode))
|
||||
messageError.ErrorCode = errCode;
|
||||
else
|
||||
_log.WarnFormat("cannot parse error code [{0}]", responseError.ErrorCode);
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<section name="bsmd.dakosy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
||||
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="bsmd.dakosy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<userSettings>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup><applicationSettings>
|
||||
<bsmd.dakosy.Properties.Settings>
|
||||
<setting name="SFTPSessionName" serializeAs="String">
|
||||
<value>dakosy</value>
|
||||
@ -19,24 +19,18 @@
|
||||
<setting name="SFTPInDir" serializeAs="String">
|
||||
<value>e:\temp\dakosy\in</value>
|
||||
</setting>
|
||||
<setting name="TestMode" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="WINSCPFullPath" serializeAs="String">
|
||||
<value>E:\Tools\WinScp\WinSCP.com</value>
|
||||
</setting>
|
||||
<setting name="RemoteProdIncomingDir" serializeAs="String">
|
||||
<setting name="RemoteIncomingDir" serializeAs="String">
|
||||
<value>in/prod/ed02</value>
|
||||
</setting>
|
||||
<setting name="RemoteTestIncomingDir" serializeAs="String">
|
||||
<value>in/test/ed02</value>
|
||||
</setting>
|
||||
<setting name="RemoteProdOutgoingDir" serializeAs="String">
|
||||
<setting name="RemoteOutgoingDir" serializeAs="String">
|
||||
<value>out/prod</value>
|
||||
</setting>
|
||||
<setting name="RemoteTestOutgoingDir" serializeAs="String">
|
||||
<value>out/test</value>
|
||||
<setting name="TestMode" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
</bsmd.dakosy.Properties.Settings>
|
||||
</userSettings>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>
|
||||
</applicationSettings>
|
||||
</configuration>
|
||||
|
||||
@ -70,14 +70,14 @@
|
||||
</Compile>
|
||||
<Compile Include="Request.cs" />
|
||||
<Compile Include="Response.cs" />
|
||||
<Compile Include="sftp.cs" />
|
||||
<Compile Include="SFtp.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\bsmdKey.snk" />
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<Generator>PublicSettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -14,14 +14,18 @@ using System.Xml;
|
||||
using System.Xml.XPath;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using log4net;
|
||||
|
||||
namespace bsmd.dakosy
|
||||
{
|
||||
/// <summary>
|
||||
/// Hilfsklasse zur Kommunikation via SFTP. Wir machen es uns hier leicht und verwenden das beliebte WINSCP im
|
||||
/// Process-Modus. (http://winscp.net/eng/docs/guide_dotnet)
|
||||
/// </summary>
|
||||
public static class sftp
|
||||
public static class SFtp
|
||||
{
|
||||
private static readonly ILog _log = LogManager.GetLogger(typeof(SFtp));
|
||||
|
||||
public static void Put(string filename, string targetDir)
|
||||
{
|
||||
Process winscp = new Process();
|
||||
@ -47,8 +51,11 @@ namespace bsmd.dakosy
|
||||
winscp.StandardInput.WriteLine(string.Format("mv {0} {1}", filename, dotlessFilename));
|
||||
winscp.StandardInput.Close();
|
||||
|
||||
// Collect all output (not used in this example)
|
||||
// Collect all output
|
||||
string output = winscp.StandardOutput.ReadToEnd();
|
||||
_log.Info(output);
|
||||
output = winscp.StandardError.ReadToEnd();
|
||||
_log.Warn(output);
|
||||
|
||||
// Wait until WinSCP finishes
|
||||
winscp.WaitForExit();
|
||||
@ -110,8 +117,11 @@ namespace bsmd.dakosy
|
||||
winscp.StandardInput.WriteLine("get *.xml");
|
||||
winscp.StandardInput.Close();
|
||||
|
||||
// Collect all output (not used in this example)
|
||||
// Collect all output
|
||||
string output = winscp.StandardOutput.ReadToEnd();
|
||||
_log.Info(output);
|
||||
output = winscp.StandardError.ReadToEnd();
|
||||
_log.Warn(output);
|
||||
|
||||
// Wait until WinSCP finishes
|
||||
winscp.WaitForExit();
|
||||
@ -139,8 +149,11 @@ namespace bsmd.dakosy
|
||||
winscp.StandardInput.WriteLine("rm " + filename);
|
||||
winscp.StandardInput.Close();
|
||||
|
||||
// Collect all output (not used in this example)
|
||||
// Collect all output
|
||||
string output = winscp.StandardOutput.ReadToEnd();
|
||||
_log.Info(output);
|
||||
output = winscp.StandardError.ReadToEnd();
|
||||
_log.Warn(output);
|
||||
|
||||
// Wait until WinSCP finishes
|
||||
winscp.WaitForExit();
|
||||
|
||||
@ -5,6 +5,7 @@ using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using log4net;
|
||||
using bsmd.database;
|
||||
using System.IO;
|
||||
|
||||
namespace bsmd.dbh
|
||||
{
|
||||
@ -67,7 +68,26 @@ namespace bsmd.dbh
|
||||
// remove files from output folder to archive folder
|
||||
|
||||
// receive files from remote host
|
||||
// SFTP verbindung öffnen und alle Dateien herunterladen
|
||||
string localDir = bsmd.dakosy.Properties.Settings.Default.SFTPInDir;
|
||||
string remoteDir = bsmd.dakosy.Properties.Settings.Default.RemoteOutgoingDir;
|
||||
|
||||
bsmd.dakosy.SFtp.GetAll(remoteDir);
|
||||
|
||||
// lokale Dateien verarbeiten
|
||||
foreach (string inputFile in Directory.GetFiles(localDir))
|
||||
{
|
||||
if (!ResponseUtil.Read(inputFile))
|
||||
{
|
||||
_log.ErrorFormat("Error reading input file {0}", inputFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
File.Delete(inputFile); // alternativ: move to archive folder
|
||||
}
|
||||
// remote Dateien löschen
|
||||
bsmd.dakosy.SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile));
|
||||
}
|
||||
// process result files
|
||||
}
|
||||
|
||||
|
||||
@ -8,5 +8,9 @@ namespace bsmd.dbh
|
||||
{
|
||||
internal static class ResponseUtil
|
||||
{
|
||||
internal static bool Read(string inputFile)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -84,6 +84,10 @@
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\bsmd.dakosy\bsmd.dakosy.csproj">
|
||||
<Project>{6255f8c4-b0b5-4e77-860e-10ebcd7b368f}</Project>
|
||||
<Name>bsmd.dakosy</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\bsmd.database\bsmd.database.csproj">
|
||||
<Project>{19945af2-379b-46a5-b27a-303b5ec1d557}</Project>
|
||||
<Name>bsmd.database</Name>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user