反汇编看起来像:
methShort( ref x, ref y );
000007FF00163F67 lea r8,[rsp+34h]
000007FF00163F6C lea rdx,[rsp+30h]
000007FF00163F71 mov rcx,qword ptr [rsp+20h]
000007FF00163F76 mov rcx,qword ptr [rcx+8]
000007FF00163F7A mov rax,qword ptr [rsp+20h]
000007FF00163F7F call qword ptr [rax+18h]
Run Code Online (Sandbox Code Playgroud)
方法"methShort"是使用Reflection.Emit在.NET中动态创建的.它将两个Int32参数作为"byRef"值.这被调试为"发布模式"构建.
我可以直接通过装配到"调用"指令.R8和RDX指向的内存(参数)看起来很好.我不知道什么样的魔法允许JIT使用寄存器来代替堆栈,但这不是重点.
当我尝试"单步执行"调用指令时,调试器会"跳过"它.该例程确实被称为 - 该方法正确执行其功能.但我似乎无法拆解或进入该方法.
在呼叫之前,RAX包含值00000000025C67A8h.当向其添加18h时,间接地址变为00000000025C67C0h.此地址的QWORD是000000001b64dc48h.
如果我尝试反汇编该地址(000000001b64dc48h),调试器将返回"无法显示指定的地址.所提供的位置没有代码".
作为Hail Mary的尝试,我尝试在没有间接的情况下在RAX上拆解代码,但正如我所料,这也失败了.
任何人都可以告诉我如何获取地址上的任何代码,或者在解码代码之前是否需要在地址(RAX + 18h)上执行类似于LEA的操作?
在C#中,不允许实现这样的接口:
public interface ITest
{
IEnumerable<int> Numbers { get; set; }
}
public class CTest : ITest
{
public List<int> Numbers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有一些软件哲学使这种类型的实现错误?它是一种有争议的范式,有点像多重继承,其中争论已经发生了几十年?
我看不出为什么这样的接口实现不能正常工作的任何原因.如果你知道ITest,那么你只能看到它的IEnumerable<int>一部分CTest.Numbers.如果您了解CTest,那么您可以使用整个List<int>实现.既然List<int>源自IEnumerable<int>,为什么它不满足接口要求?
我的软件运行在一个由外部服务器任意设置其系统时钟的系统上。没有关于 (a) 发生多少时间变化的规则或保证;(b) 这个时间变化发生的频率。
我的第一个问题:在这种情况下,是否有处理截止日期的最佳实践,因为截止日期(截至目前)是绝对时间而不是持续时间?
我的第二个问题:如果我的软件既不关心交付确认也不关心 rpc 调用的返回值,我是否可以安全地将截止日期设置为“现在”甚至过去的时间,以便尽快返回 rpc 调用尽可能?即如果截止日期已经过去,是否保证发送 rpc 的传出有效载荷?
这并不重要,但我在不同的应用程序中同时使用了 gRPC 的 .NET 和 C++ 实现。