C# 对象远程传输

C# 对象远程传输,c#,xml,reflection,devexpress,codedom,C#,Xml,Reflection,Devexpress,Codedom,我有一个更好的对象,一个类。它就像一个赢的形式,由以下部分组成: class.cs、class.Designer.cs和最后一个class.Resx 它是一个XtraReport,所以我要做的是获取这个对象并将其序列化为一个xml文件,该文件保存了关于其控件的足够信息。生成的xml用于另一个仅使用xml的项目。问题是这还不够,尽管xml拥有所有信息,但它仍然需要原始对象来正确解析控件。基本上: 保存Xml-第一个解决方案(C#解决方案): 使用Xml—另一种解决方案(C#解决方案) 这两个类都是

我有一个更好的对象,一个类。它就像一个赢的形式,由以下部分组成:

class.cs、class.Designer.cs和最后一个class.Resx

它是一个
XtraReport
,所以我要做的是获取这个对象并将其序列化为一个xml文件,该文件保存了关于其控件的足够信息。生成的xml用于另一个仅使用xml的项目。问题是这还不够,尽管xml拥有所有信息,但它仍然需要原始对象来正确解析控件。基本上:

保存Xml-第一个解决方案(C#解决方案):

使用Xml—另一种解决方案(C#解决方案)

这两个类都是XtraReports中的子类:

public class MyCompleteReportDrawInDesignerMode : XtraReport

public class GenericClass : XtraReport
这不起作用,因为另一个解决方案没有关于MyCompleteReportDrawInDesignerMode的线索。所以我想,为什么不远程传送整个物体,让它发生呢

//Build the object
var generator = GetObjectFromText(text);
//Resolve the dependecy check
var objectGenerated = generator.ResolveAssembly();
但我不知道该怎么做,也不知道它是否可行。有什么想法吗

更新:

我想将类实现存储在数据库中,并从另一个应用程序重建它,因为xml转换正在导致信息丢失

让我介绍一个更深入的背景。我们正在构建一个报表服务器应用程序。这个过程基本上是:

1-在设计器模式下设计XtraReport,设置字段数据绑定,设置xrsubreports报告源(如果有) 2-从中生成xml文件并保存在本地C:\hard driver中。 3-在另一个应用程序中,用户上载此文件并将其序列化为varbinary。 4-客户端接收此序列化xml并将其还原,然后尝试加载到通用XtraReport类中


因此,我必须在运行时创建并绑定此程序集,因为我们无法在构建每个新报表时重新发布产品的新版本。

您需要让两个解决方案都知道
myCompleteReportDrawIndexignerMode


创建一个单独的类库程序集(单独的项目),该程序集定义
MyCompleteReportDrawInDesignerMode
。然后,两个应用程序都可以引用此程序集(DLL);将报表写入XML文件和读取此文件并重新创建报表的解决方案。

找到的解决方案是创建一个类库visual studio解决方案,然后设计报表、子报表,编译所有内容,并将dll序列化为sql server中的varbinary列。dll很小,大约100 KB,所以没有问题

序列化到数据库后,其他应用程序可以使用dll。在同一个表中,我们从主报告中输入名称空间和类名,以便您可以在运行时创建实例,填充数据源并打印。我发现xml序列化只适用于最新的devexpress版本,如:13.1.10

代码如下:

Assembly local = 
     Assembly.LoadFile(@"C:\TempReports\5a788bc0-3e70-4f8b-8fa9-f180d23c4f03.dll");

Type t = _local.GetType("Relatórios_Teste.Reports.FluxoCaixa");

object test = Activator.CreateInstance(t);

var report = (XtraReport) test;

var controls = report.AllControls<XRSubreport>();
foreach (var control in controls)
{
    if (control.Name.Equals("sub_detail"))
    {
        control.ReportSource.DataSource = GetSource();
        control.ReportSource.DataMember = @"sp_test";
    }
}
report.ShowPreview();
程序集本地=
加载文件(@“C:\TempReports\5a788bc0-3e70-4f8b-8fa9-f180d23c4f03.dll”);
Type t=_local.GetType(“Relatórios_Teste.Reports.FluxoCaixa”);
对象测试=Activator.CreateInstance(t);
var报告=(XtraReport)测试;
var controls=report.AllControls();
foreach(控件中的var控件)
{
if(control.Name.Equals(“子详细信息”))
{
control.ReportSource.DataSource=GetSource();
control.ReportSource.DataMember=@“sp_测试”;
}
}
report.ShowPreview();

Teletransport?不确定,但这不是星际旅行。请解释一下。我想用反射和它的文本来重建这个对象。如果你不打算提供反序列化所需的程序集,那么这就不可能实现。为什么不能将程序集提供给接收序列化xml的一方?那么您是说我还需要程序集(包含类实现的dll)来正确加载xml?我不太明白。从来没有这样做过。根据我在你的问题中看到的,我会说:是的。奥利弗,我发布了一些更新,基本上我们需要在运行时进行更新,所以这就是为什么我认为“远程传输”概念会有用的原因。好吧,现在是一半。我可以创建一个类库项目并将其用作dll,但我必须通过获取dll使第二个应用程序知道类的类型。是的,您可以“远程传输”对象数据(即,您可以序列化和反序列化对象字段),但不能使用对象方法的代码。因此,任何逻辑都必须通过库程序集共享。如果我将dll引用到消费解决方案中,报告将毫无问题地打印出来,我只是不知道如何将dll序列化到sql server列(可能是varbinary)中,并在运行时加载dll;但是,您不能卸载它们。因此,请谨慎地只加载其中一个。请参阅我答案的最后一部分:关于加载插件
//Build the object
var generator = GetObjectFromText(text);
//Resolve the dependecy check
var objectGenerated = generator.ResolveAssembly();
Assembly local = 
     Assembly.LoadFile(@"C:\TempReports\5a788bc0-3e70-4f8b-8fa9-f180d23c4f03.dll");

Type t = _local.GetType("Relatórios_Teste.Reports.FluxoCaixa");

object test = Activator.CreateInstance(t);

var report = (XtraReport) test;

var controls = report.AllControls<XRSubreport>();
foreach (var control in controls)
{
    if (control.Name.Equals("sub_detail"))
    {
        control.ReportSource.DataSource = GetSource();
        control.ReportSource.DataMember = @"sp_test";
    }
}
report.ShowPreview();