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