2016-06-16 9 views
0

Ich möchte DLLs teilen, die ich zwischen verschiedenen exe's gemacht habe. Jede Datei befindet sich in derselben Map. Aber wie kann ich meine Daten von einer Exe in eine DLL ändern und auch die Änderung in einer anderen DLL sehen?C# share verschiedene dlls zwischen verschiedenen exe's

Im Internet sieht es so aus, als müsste ich einen WCF-Dienst verwenden. Aber was ich mache ist nur lokal, also habe ich mich gefragt, ist das nicht anders?

Wenn es keine andere Möglichkeit gibt, ich habe auch ein Problem mit meinem WCF-Dienst, erhalte ich die folgende Fehlermeldung:

The type Newtonsoft.Json.Linq.JToken is a recursive data collection contract. This is not supported. To work around this problem by changing the definition of the collection Newtonsoft.Json.Linq.JToken so that it contains no references to himself.

Und beneed ist mein Code:

//SERVER SIDE 
internal class CommunicationService 
{ 
    #region Fields 
    private ServiceHost _service_host; 
    private static CommunicationService _instance; 
    #endregion 

    #region Init 
    internal static CommunicationService Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new CommunicationService(); 
      } 
      return _instance; 
     } 
    } 
    private CommunicationService() 
    { 
     string address = string.Format("http://127.0.0.1:{0}", RegSettings.Instance.Port); 
     _service_host = new ServiceHost(typeof(NGX3WCFService.Interfaces.NGX3Service), new Uri(address)); 
     BasicHttpBinding basic_http_binding = new BasicHttpBinding(); 
     Uri uri_address = new Uri(address); 
     ServiceMetadataBehavior service_metadata_behavior = _service_host.Description.Behaviors.Find<ServiceMetadataBehavior>(); 

     if (service_metadata_behavior == null) 
     { 
      service_metadata_behavior = new ServiceMetadataBehavior(); 
      _service_host.Description.Behaviors.Add(service_metadata_behavior); 
     } 

     service_metadata_behavior.HttpGetEnabled = true; 
     service_metadata_behavior.HttpGetUrl = new Uri(string.Format("{0}/ngx3wsd", address)); 
     _service_host.AddServiceEndpoint(typeof(INGX3Service), basic_http_binding, string.Format("{0}/ngx3", address)); 
    } 
    #endregion 

    #region StartStop 
    internal void Start() 
    { 
     _service_host.UnknownMessageReceived += _service_host_UnknownMessageReceived; 
     _service_host.Open(); 
    } 

    internal void Stop() 
    { 
     _service_host.Close(); 
     _service_host.UnknownMessageReceived -= _service_host_UnknownMessageReceived; 
    } 

    private void _service_host_UnknownMessageReceived(object sender, UnknownMessageReceivedEventArgs e) 
    { 
     LogFile.Instance().Append(e.Message.ToString()); 
    } 
    #endregion 
} 

//INTERFACE 
[ServiceContract] 
public interface INGX3Service 
{ 
    [OperationContract] 
    bool ValidateConnection(); 

    [OperationContract] 
    Dictionary<string, JToken> GetCustomerPrinterScanInfo(); 
    [OperationContract] 
    Dictionary<string, JToken> GetCustomerPrinterReadInfo(); 
    [OperationContract] 
    Dictionary<string, List<SNMPVariable>> GetCustomerPrinterFetchInfo(); 
    [OperationContract] 
    Dictionary<string, JToken> GetCustomerPrinterSpoolerInfo(); 
    [OperationContract] 
    void SetCustomerPrinterReadInfo(string id, JToken data); 
    [OperationContract] 
    void SetCustomerPrinterFetchInfo(string id, List<SNMPVariable> data); 
    [OperationContract] 
    void SetCustomerPrinterSpoolerInfo(string id, JToken data); 

    [OperationContract] 
    void UpdateJsonSettings(JToken data); 
    [OperationContract] 
    RegSettings GetRegSettings(); 
} 


[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class NGX3Service : INGX3Service 
{ 
    #region Validate 
    public bool ValidateConnection() 
    { 
     return true; 
    } 
    #endregion 

    #region CustomerPrinterInfo 
    public Dictionary<string, JToken> GetCustomerPrinterScanInfo() 
    { 
     Dictionary<string, JToken> data = new Dictionary<string, JToken>(); 

     foreach (Subnet subnet in NetworkController.Instance.Subnets) 
     { 
      foreach (Host host in subnet.Hosts) 
      { 
       if (!string.IsNullOrEmpty(host.Id) && host.Id.Length == 40 && host.Protocol == NetworkEngine.Enumerations.Protocol.SNMP && host.DeviceType == NetworkEngine.Enumerations.DeviceType.Printer && !data.ContainsKey(host.Id)) 
       { 
        data[host.Id] = host.ReadScanData(); 
       } 
      } 
     } 

     return data; 
    } 

    public Dictionary<string, JToken> GetCustomerPrinterReadInfo() 
    { 
     Dictionary<string, JToken> data = new Dictionary<string, JToken>(); 

     foreach (Subnet subnet in NetworkController.Instance.Subnets) 
     { 
      foreach (Host host in subnet.Hosts) 
      { 
       if (!string.IsNullOrEmpty(host.Id) && host.Id.Length == 40 && host.Protocol == NetworkEngine.Enumerations.Protocol.SNMP && host.DeviceType == NetworkEngine.Enumerations.DeviceType.Printer && !data.ContainsKey(host.Id)) 
       { 
        data[host.Id] = host.ReadInfo(); 
       } 
      } 
     } 

     return data; 
    } 

    public Dictionary<string, List<SNMPVariable>> GetCustomerPrinterFetchInfo() 
    { 
     Dictionary<string, List<SNMPVariable>> data = new Dictionary<string, List<SNMPVariable>>(); 

     foreach (Subnet subnet in NetworkController.Instance.Subnets) 
     { 
      foreach (Host host in subnet.Hosts) 
      { 
       if (!string.IsNullOrEmpty(host.Id) && host.Id.Length == 40 && host.Protocol == NetworkEngine.Enumerations.Protocol.SNMP && host.DeviceType == NetworkEngine.Enumerations.DeviceType.Printer && !data.ContainsKey(host.Id)) 
       { 
        data[host.Id] = host.ReadFetchData(); 
       } 
      } 
     } 

     return data; 
    } 

    public Dictionary<string, JToken> GetCustomerPrinterSpoolerInfo() 
    { 
     Dictionary<string, JToken> data = new Dictionary<string, JToken>(); 

     foreach (Printer printer in PrintSpooler.Instance.Printers) 
     { 
      if (printer.Id != null && printer.Id.Length == 40) 
      { 
       JObject jobject = new JObject(); 
       jobject.Add("customer_printer_id", printer.Id); 
       jobject.Add("printer_info", JsonFile.Instance("printer_info", printer.Id).Read<JToken>()); 
       jobject.Add("job_info", printer.ReadJobs()); 

       data.Add(printer.Id, jobject); 
      } 
     } 

     return data; 
    } 

    public void SetCustomerPrinterReadInfo(string id, JToken data) 
    { 
     foreach (Subnet subnet in NetworkController.Instance.Subnets) 
     { 
      Host host = subnet.Hosts.FirstOrDefault(h => h.Id.Equals(id)); 

      if (host != null) 
      { 
       host.WriteInfo(data); 
      } 
     } 
    } 

    public void SetCustomerPrinterFetchInfo(string id, List<SNMPVariable> data) 
    { 
     foreach (Subnet subnet in NetworkController.Instance.Subnets) 
     { 
      Host host = subnet.Hosts.FirstOrDefault(h => h.Id.Equals(id)); 

      if (host != null) 
      { 
       host.WriteFetchInfo(data); 
      } 
     } 
    } 

    public void SetCustomerPrinterSpoolerInfo(string id, JToken data) 
    { 
     Printer printer = PrintSpooler.Instance.Printers.FirstOrDefault(p => p.Id.Equals(id)); 

     if (printer != null) 
     { 
      printer.WriteJobs(data["job_info"]); 
     } 
    } 
    #endregion 

    #region Settings 
    public void UpdateJsonSettings(JToken data) 
    { 
     JsonSettings.Instance.Load(data); 
    } 

    public RegSettings GetRegSettings() 
    { 
     return RegSettings.Instance; 
    } 
    #endregion 
} 
+0

Dies sind zwei Fragen. Das Teilen von Daten zwischen Prozessen kann auf verschiedene Arten erfolgen - Middleware, die in potentielle Unordnung mit Sperren usw. gerät und öffentlich freigegebene veränderbare Daten hat. Setzen Sie eine Datenbank ein, und lassen Sie das mit der Koordination umgehen .... Dies basiert auf Meinungen. Das zweite Problem scheint spezifischer zu sein - aber ich würde mehr Details benötigen, um es beantworten zu können. – doctorlove

Antwort

1

Wie Sie vermuten, - Die DLL teilt nur Code - keine Daten. Jedes wird ein separater Prozess sein.

Es gibt mehrere Möglichkeiten, zwischen zwei Prozessen zu teilen - eine Option, die Sie interessieren könnte, ist Shared Memory/Memory mapped files.

Verwandte Themen