我需要在我的应用程序中使用跨appdomain调用,有时我有这个RemotingException:
对象'/2fa53226_da41_42ba_b185_ec7d9c454712/ygiw+xfegmkhdinj7g2kpkhc_7.rem'已断开连接或在服务器上不存在.
目标对象仍然存在,我已经检查过了.
UPD我在目标对象的终结器中设置断点,它永远不会命中.因此,这个对象是活着的,而不是GC.
如何在一个好的但多重继承的截肢语言如C#中解决"Must be MarshalByRefObject"?
问题非常简单,在某些情况下,您只需继承此类(基础结构要求).这在哪种情况下并不重要.那么,如果你已经从其他一些类(你的域模型要求)继承了,你会怎么做?
顺便说一句好的应用程序框架,就像spring.net一样,无论你需要在什么类型的基础架构中应用你的类,都要确保你不必继承这个类.
我想知道我在这里得到什么-3票?:)
访问Form上的成员可能会导致运行时异常,因为它是marshal-by-reference类的字段
我知道这个警告是什么,知道如何解决它.
我的问题是为什么这会导致运行时错误?
我一直在尝试AppDomain使用以下代码跨越边界序列化数组:
public int Read(byte[] buffer, int offset, int count)
{
return base.Read(buffer, offset, count);
}
Run Code Online (Sandbox Code Playgroud)
作为一个猜测,在注意到其他地方的属性之后,我用方法[In]和[Out]属性标记了方法的参数,这似乎导致参数的行为就好像它们是通过引用传递的一样.
例如:
public int Read([In, Out] byte[] buffer, int offset, int count)
{
return base.Read(buffer, offset, count);
}
Run Code Online (Sandbox Code Playgroud)
在添加属性之前,buffer从方法跨越AppDomain边界返回后,变量的内容会丢失.
class(SslStream)继承自MarshalByRefObject但未标记Serializable属性.这是使参数按值传递的唯一方法吗?在序列化类时,这些属性是否被.NET以某种方式识别?它们是否真的导致参数通过引用传递,或者内容是否被复制?
我一直在尝试使用以下代码(所有内容都在同一个程序集中定义):
namespace SomeApp{
public class A : MarshalByRefObject
{
public byte[] GetSomeData() { // }
}
public class B : MarshalByRefObject
{
private A remoteObj;
public void SetA(A remoteObj)
{
this.remoteObj = remoteObj;
}
}
public class C
{
A someA = new A();
public void Init()
{
AppDomain domain = AppDomain.CreateDomain("ChildDomain");
string currentAssemblyPath = Assembly.GetExecutingAssembly().Location;
B remoteB = domain.domain.CreateInstanceFromAndUnwrap(currentAssemblyPath,"SomeApp.B") as B;
remoteB.SetA(someA); // this throws an ArgumentException "Object type cannot be converted to target type."
}
}
}
Run Code Online (Sandbox Code Playgroud)
我要做的是将第一个AppDomain中创建的"A"实例的引用传递给子域,并让子域在第一个域上执行方法.在'B'代码的某些方面,我将调用'remoteObj.GetSomeData()'.必须这样做,因为'GetSomeData'方法中的'byte …
我有一些代码依赖于没有内联的方法:
internal class MyClass : BaseClass
{
// should not be inlined
public void DoSomething(int id)
{
base.Execute(id);
}
}
public abstract class BaseClass : MarshallByRefObject
{
[MethodImpl(MethodImplOptions.NoInlining)]
protected void Execute(params object[] args)
{
// does a stack walk to find signature of calling method
}
}
Run Code Online (Sandbox Code Playgroud)
当然,只有在未内联DoSomething方法时,这才有效.这就是基类派生的原因MarshallByRefObject,它阻止了公共方法的内联.
它一直工作到现在,但我从.Net 4服务器得到了一个堆栈跟踪,显示堆栈行走到了DoSomething的调用者.
.Net 4内联是否更加聪明并且检测到MyClass是内部的并且没有机会被代理替换?
各种消息来源解释说
当对象从MarshalByRefObject派生时,对象引用将从一个应用程序域传递到另一个应用程序域而不是对象本身.当一个对象用[Serializable]标记时,该对象将自动序列化,从一个应用程序域传输到另一个应用程序域,然后反序列化以在第二个应用程序域中生成该对象的精确副本.请注意,当MarshalByRefObject传递引用时,[Serializable]会导致复制对象.[资源]
我正在设计我的第一个使用AppDomains的应用程序,我想知道当您对MarshalByRefObjects可执行MarshalByRefObject的可序列化对象内部的引用时会发生什么,因为到目前为止我找不到关于该主题的任何文档.
例如,如果我尝试返回跨AppDomain边界的List<MBR>位置会发生什么MBR : MarshalByRefObject?我是否获得原始对象的List<MBR>每个MBR位置 的副本TransparentProxy?有没有关于混合这两种机制的技术细节的文档?
当您将从 MarshalByRefObject 继承的对象传递给不同的 AppDomain 时,创建该对象的 AppDomain 引发的 GC.Collect() 不会收集该对象,前提是该对象在 GC.Collect( 时未植根于任一 AppDomain 中) )叫?
[当我说没有 root 时,我的意思是开发人员编写的代码不再访问它。]
看来该对象并没有被收集,而是被提升到了下一代!
但是,如果我停止将对象传递给 diff AppDomain,它就会按预期被收集。
这是设计使然吗?如果有的话有什么道理吗?
多谢你们,
PS 我知道代码中的 GC.Collect() 出于多种原因是不好的,我只是想了解 GC 如何在 MBRO 上发生。
我想知道是否有可能对我的类进行注释,以便第一次编组遇到一个对象,它会生成一个相应类型的XML元素,但是任何后续对该对象的任何引用都会创建一个XML IDREF条目?
我有一个插件系统,我用它MarshalByRefObject来创建每个插件的隔离域,因此用户可以重新加载他们认为合适的新版本,而无需关闭主应用程序.
现在我需要允许插件查看当前正在运行的插件,并且可能启动/停止特定的插件.
我知道如何从包装器发出命令,例如在下面的代码中:
using System;
using System.Linq;
using System.Reflection;
using System.Security.Permissions;
namespace Wrapper
{
public class RemoteLoader : MarshalByRefObject
{
private Assembly _pluginAassembly;
private object _instance;
private string _name;
public RemoteLoader(string assemblyName)
{
_name = assemblyName;
if (_pluginAassembly == null)
{
_pluginAassembly = AppDomain.CurrentDomain.Load(assemblyName);
}
// Required to identify the types when obfuscated
Type[] types;
try
{
types = _pluginAassembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types = e.Types.Where(t => t != null).ToArray();
}
var type = types.FirstOrDefault(type => …Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×4
appdomain ×4
remoting ×2
.net-4.0 ×1
attributes ×1
clr ×1
inline ×1
jaxb ×1
jaxb2 ×1
marshalling ×1
parameters ×1
runtime ×1
warnings ×1
xml ×1