2016-06-16 53 views
0

我想分享我在不同的exe之间创建的DLL。每个文件都在相同的地图中。但是,如何才能将数据从一个exe文件更改为dll文件,并查看另一个dll文件中的更改?C#在不同的exe之间共享不同的DLL

在互联网上它看起来像我需要使用WCF服务。但我所做的只是本地的,所以我想知道他们没有其他办法吗?

如果没有别的办法,我也有一个问题,我的WCF服务,我得到以下错误:

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.

而且beneed是我的代码:

//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

这是两个问题。在进程之间共享数据可以通过各种方式完成 - 中间件,陷入潜在的混乱与锁等,并有公共共享的可变数据。把它放在数据库中,让它处理协调......这是基于意见的。第二个问题似乎更具体 - 但我需要更多的细节才能够回答。 – doctorlove

回答

1

正如你猜想 - DLL只共享代码 - 不是数据。每个将运行一个单独的过程。

在两种处理之间有几种共享方式 - 您可能感兴趣的一种选择是Shared Memory/Memory mapped files

相关问题