C# 按WCF划分的运输类别

C# 按WCF划分的运输类别,c#,wcf,C#,Wcf,我的目标是在运行的应用程序环境中加载一个外部类(比如插件模型)。在运行环境中创建类的实例不是问题(类使用接口)。问题是获取必须从中心WCF服务中可用的类 是否可以使用WCF将类或程序集传输到客户端 大概是这样的: [ServiceContract] public interface ISourceData { [OperationContract] xxx GetClassData { get; set; } // <-- here to get data the cla

我的目标是在运行的应用程序环境中加载一个外部类(比如插件模型)。在运行环境中创建类的实例不是问题(类使用接口)。问题是获取必须从中心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
}
[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
}
[服务合同]
公共接口ISourceData
{
[经营合同]
xxx GetClassData{get;set;}/是的,您可以

而且还必须定义类的类型,如↓

[ServiceKnownType(typeof(xxx))]
public interface IService
是的,你可以

而且还必须定义类的类型,如↓

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

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


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

我认为您需要客户端上的程序集,因此您需要将包含程序集的dll传输到客户端,然后让客户端将其保存在应用程序的插件目录中,并让应用程序和loa从那里开始


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

首先,上面示例中的属性必须是
OperationContract
,而不是
DataContract
DataContract
属性是针对要返回的类的
GetClassData

这种情况下的问题是,在客户端,添加服务引用时不会复制类本身,但会为您在
DataContract
中定义的属性生成存根。因此,您将获得数据,而不是逻辑

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

编辑

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

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

这种情况下的问题是,在客户端,添加服务引用时不会复制类本身,但会为您在
DataContract
中定义的属性生成存根。因此,您将获得数据,而不是逻辑

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

编辑

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

您可以这样标记接口中使用的类:

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

您可以这样标记接口中使用的类:

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