WCF的运输类

时间:2011-07-12 09:00:45

标签: c# wcf

我的目标是在正在运行的应用程序环境中加载外部类(如插件模型)。在运行环境中创建类的实例不是问题(使用接口的类)。问题是获取必须从中央WCF服务获得的类。

是否可以使用WCF将类或程序集传输到客户端?

这样的事情:

[ServiceContract]
public interface ISourceData
{
    [OperationContract]
    xxx GetClassData { get; set; }  // <-- here to get data the class to app can create an instances of this
}

我希望你了解我的情况。感谢。

4 个答案:

答案 0 :(得分:3)

首先,上面示例中的属性必须是OperationContract,而不是DataContractDataContract属性适用于您要在GetClassData中返回的类。

您遇到的问题是,在客户端,添加服务引用时不会复制类本身,但会为您在DataContract中定义的属性生成存根。所以你得到了数据,但不是逻辑。

您现在可以创建一个程序集来定义要交换的数据类,并将它们添加到服务和客户端,但正如我理解您的问题,您希望在服务中动态加载程序集并发送这些“实现”没有客户端实际访问实现该类的DLL的客户端。这可能不是一件容易的事。

修改
重新阅读您的问题我现在明白您不想“转移实例”,但您想要转移类定义。一种方法是实际传输类的源代码并尝试使用Reflection.Emit来创建动态程序集。可以找到here的示例。

答案 1 :(得分:0)

是的,你可以。

您还必须定义类的类型,例如↓

[ServiceKnownType(typeof(xxx))]
public interface IService

答案 2 :(得分:0)

我认为您需要在客户端上进行程序集,因此您需要将包含程序集的dll传输到客户端,然后让客户端将其保存在应用程序的plugins目录中并拥有应用程序并从那里加载它。

虽然我认为这将是一个权限噩梦,让应用程序能够使用从服务下载的dll。

答案 3 :(得分:0)

您可以像这样标记界面中使用的类:

[ServiceContract]

public interface ISourceData
{    

[OperationContract]

MyClass GetClassData();

}


[DataContract]

public class MyClass 
{

    [DataMember]
    public string MyMember1 {get; set;}  // included in transport

    public int MyMember2 {get; set;}  // not included
}