C#在不同的exe之间共享不同的dll

时间:2016-06-16 09:20:49

标签: c# json wcf dll exe

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

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

如果没有其他办法,我的WCF服务也出现问题,我收到以下错误:

  

Newtonsoft.Json.Linq.JToken类型是递归数据收集合约。这不受支持。要通过更改集合Newtonsoft.Json.Linq.JToken的定义来解决此问题,以便它不包含对自己的引用。

好的是我的代码:

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

1 个答案:

答案 0 :(得分:1)

正如您所怀疑的那样 - DLL只共享代码 - 而不是数据。每个都将是一个单独的过程。

有两种方法可以在两个进程之间共享 - 您可能感兴趣的一个选项是Shared Memory / Memory mapped files