我想分享我在不同的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
}
答案 0 :(得分:1)
正如您所怀疑的那样 - DLL只共享代码 - 而不是数据。每个都将是一个单独的过程。
有两种方法可以在两个进程之间共享 - 您可能感兴趣的一个选项是Shared Memory / Memory mapped files。