Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ref传参报错 #70

Open
sunsunyang opened this issue Oct 14, 2020 · 4 comments
Open

Ref传参报错 #70

sunsunyang opened this issue Oct 14, 2020 · 4 comments

Comments

@sunsunyang
Copy link

sunsunyang commented Oct 14, 2020

服务端:

HttpListener server = new HttpListener();
            server.Prefixes.Add("http://localhost:10240/");
            server.Start();
 TypeManager.Register<ServiceVersion>("ServiceVersion");
 Service service = new Service().Bind(server).AddInstanceMethods(new Hello(), "ty");

自定义类型:

public class ServiceVersion
    {
        public string Name;
        public string Version;
        public ServiceVersion()
        {
            Name = "blend";
            Version = "1";
        }
    }
public class Hello:IHello
    {
        public string GetTargetVerByRef(ref ServiceVersion version)
        {
            version.Name = "hahah";
            return version.Name;
        }
    }

 public interface IHello
    {
        string GetTargetVerByRef(ref ServiceVersion version);
}

客户端:

     using (Client httpCli = new Client("http://localhost:10240/"))
            {
                IHello hello = httpCli.UseService<IHello>("ty");
                TypeManager.Register<ServiceVersion>("ServiceVersion");
                ServiceVersion sv = new ServiceVersion();

                var ret3 = hello.GetTargetVerByRef(ref sv)}

异常:

        异常信息:System.Exception:"类型"Commaon.ServiceVersion&"不能用作类型参数
	异常堆栈:
	   在 Hprose.RPC.ClientCodec.Decode(MemoryStream response, ClientContext context)
	   在 Hprose.RPC.Client.<Call>d__50.MoveNext()
	--- 引发异常的上一位置中堆栈跟踪的末尾 ---
	   在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
	   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
	   在 Hprose.RPC.Client.<InvokeAsync>d__49`1.MoveNext()
	--- 引发异常的上一位置中堆栈跟踪的末尾 ---
	   在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
	   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
	   在 Hprose.RPC.Client.Invoke[T](String name, Object[] args, ClientContext context)
	   在 Hprose.RPC.SyncInvoker`1.Invoke(Object[] args)
	   在 $Proxy0.IHello.GetTargetVerByRef(ServiceVersion& )
	   在 HproseClient.Program.Main(String[] args) 位置 E:\20190910DY\MyDir\Winform\TestHPROSE\TestHprose\HproseClient\Program.cs:行号 50

分析:
问题应该出在服务端给参数类型解码的时候,但是我该如何解决这个问题呢?

@andot
Copy link
Member

andot commented Oct 15, 2020

hprose 3.0 协议已经把引用参数支持这个功能去掉了。因为这个功能不常用,所以在 hprose 3.0 里面,参数不支持引用类型。

@sunsunyang
Copy link
Author

hprose 3.0 协议已经把引用参数支持这个功能去掉了。因为这个功能不常用,所以在 hprose 3.0 里面,参数不支持引用类型。

小马哥您好,我的项目中存在大量带引用传参的方法,我现在想要这个功能应该怎么办,能不能指点下迷津。

@sunsunyang
Copy link
Author

hprose 3.0 协议已经把引用参数支持这个功能去掉了。因为这个功能不常用,所以在 hprose 3.0 里面,参数不支持引用类型。

小马哥,可以提供付费支持吗,嘿嘿

@andot
Copy link
Member

andot commented Oct 19, 2020

这个是 3.0 协议本身不支持 ref 类型传递了。不是付费就能支持的。旧的 1.0 和 2.0 协议是支持的,但是因为这个功能实现太复杂了,支持它会让更多其它的功能无法很好的实现,所以 3.0 把这个功能给砍掉了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants