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