【问题标题】:C# share different dll's between different exe'sC#在不同的exe之间共享不同的dll
【发布时间】:2016-06-16 09:20:48
【问题描述】:

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

在互联网上,我似乎需要使用 WCF 服务。但是我做的只是本地的,所以我想知道他们没有别的办法吗?

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

Newtonsoft.Json.Linq.JToken 类型是一种递归数据收集合约。这是不支持的。要解决此问题,请更改集合 Newtonsoft.Json.Linq.JToken 的定义,使其不包含对自己的引用。

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
}

【问题讨论】:

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

标签: c# json wcf dll exe


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 2020-04-08
    • 2012-05-19
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2018-01-04
    相关资源
    最近更新 更多