Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我无法修改的库中类的Wcf datacontract_.net_Wcf_Datacontracts - Fatal编程技术网

.net 我无法修改的库中类的Wcf datacontract

.net 我无法修改的库中类的Wcf datacontract,.net,wcf,datacontracts,.net,Wcf,Datacontracts,嗨,我有一个类库,它执行方法,并有许多不同的类,它使用这些类作为方法调用的参数。。。 我正在为这个类库创建一个wcf包装器。但是我没有更改类库的权限 现在我的问题是如何轻松地将这些类公开为数据协定/数据成员 我有大约100个不同的类,我需要这些方法 谢谢我从未尝试过,但您可以尝试使用分部类和分部方法添加属性 如果您真的无法更改库,那么我相信通过WCF公开类的唯一选择就是为每个方法创建包装器对象。我将考虑为这个任务编写一个代码生成器 可以在程序集中反映要公开的类型集,以获取所需的类型元数据信息 您

嗨,我有一个类库,它执行方法,并有许多不同的类,它使用这些类作为方法调用的参数。。。 我正在为这个类库创建一个wcf包装器。但是我没有更改类库的权限

现在我的问题是如何轻松地将这些类公开为数据协定/数据成员

我有大约100个不同的类,我需要这些方法


谢谢

我从未尝试过,但您可以尝试使用分部类和分部方法添加属性

如果您真的无法更改库,那么我相信通过WCF公开类的唯一选择就是为每个方法创建包装器对象。我将考虑为这个任务编写一个代码生成器

可以在程序集中反映要公开的类型集,以获取所需的类型元数据信息

您可以使用t4模板(VS2008及以上版本的一部分)和创建代码生成器来为您编写代码。一旦生成器完成,如果您的库发生更改,那么应该可以很容易地再次运行。更新代码生成器并重新运行它也很容易修复bug

我提到的另一个选项只是为了完整性,但有一些棘手的问题,那就是反汇编并修补有问题的代码。您可以使用类似ildasm的东西来转储程序集的il,添加必要的WCF属性,然后用ilasm重新组装它。但是,该过程可能容易出错,每当程序集发生更改时,您都必须重做该过程,这可能会出现法律问题,具体取决于谁拥有该程序集的IP,并且您必须重新签名该程序集,如果它需要是强名称程序集,则可能需要使用不同的加密证书

*编辑*

请求的包装器代码示例:

public class ToWrap {
  public String Name { get; set; }
  public String Address { get; set; }
}

[DataContract]
public class Wrapper {
  private ToWrap _wrapped;

  // constructor for WCF marshalling
  public Wrapper() {
    _wrapped = new ToWrap();
  }

  public Wrapper(ToWrap wrapped) {
    _wrapped = wrapped;
  }

  [DataMember]
  public String Name {
    get { return _wrapped.Name; }
    set { _wrapped.Name = value; }
  }

  [DataMember]
  public String Address {
    get { return _wrapped.Address; }
    set { _wrapped.Address = value; }
  }
}

如果这些类被标记为[Serializable],那么您仍然可以在WCF ServiceContract中使用它们,但如果它们不是,那么就没有简单的方法来实现。您别无选择,只能创建一组具有相同属性的新类,然后在每次要调用库的某个函数时逐个属性地将它们复制到库的等效项中。

从.Net 3.5 SP1开始,您不再需要指定DataContract。您可以简单地使用ServiceContract中的类


要获得完整的解释,请查看,其中讨论了何时使用和何时不使用DataContract及其后果。

它们是否标记为[Serializable]?-1这是行不通的。分部类由编译器实现,而不是由运行时实现。它们在编译时解析。这将涉及修改库。您好,谢谢您的回复。。我认为围绕这些类创建包装器对我来说是最好的选择。。你能举一个例子说明如何为一个由两个属性组成的小类创建包装器吗。。唯一代码。。稍后我将研究t4模板。。Thanks@Prakash-您能否澄清您想要哪种代码。请记住,我建议您编写的代码将编写更多的代码。包装器代码将是代码生成器的输出,应该相当简单。获取类型信息的反射代码和创建生成器以编写给定类型输入集的包装器代码所需的所有元数据将更加复杂。我会安排自己大概3个工作日来写它。我只想举一个包装器类的小例子。。假设我有一个类,它有两个公共属性。。可能是公共类客户{public string name;public string address;}该类的包装器是什么?