我的目标是在正在运行的应用程序环境中加载外部类(如插件模型)。在运行环境中创建类的实例不是问题(使用接口的类)。问题是获取必须从中央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
}
我希望你了解我的情况。感谢。
答案 0 :(得分:3)
首先,上面示例中的属性必须是OperationContract
,而不是DataContract
。 DataContract
属性适用于您要在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
}