使用CallByName和Invoke

时间:2016-09-17 23:14:47

标签: c# .net vb.net

我已经删除了第一次提出这个问题的尝试,因为我没有完全掌握语义。现在我好多了。基本上这是问题所在。我有一小块在线演示代码我正在分析,它展示了如何从C#访问VB中的与汇编相关的函数。基本上使用CallbyName到VB函数在C#中加载和执行程序集。以下是相关代码,其中定义了所有变量:

// the only non-default usings for this code are:

using Microsoft.VisualBasic;
using System.Reflection;

private void Form1_Load(object sender, EventArgs e)
    {

     string exefile = Properties.Resources.binaryfile;

     // Convert base64 to bytes

     byte[] exe_bytes = Convert.FromBase64String(exefile);

     // okay, the load call takes as an argument the byte array exe_bytes,
     // this makes sense

     object loaded = Interaction.CallByName(AppDomain.CurrentDomain, "load",CallType.Method, exe_bytes);

     // next, the entrypoint is taken from the loaded assembly, and
     // passed to the object entry

     object entry = Interaction.CallByName(loaded, "entrypoint", CallType.Get);

     // finally, invoke is called to execute it, being passed the 
     //  entrypoint.  But what are the null, null for?  This seems
     //  to be what is throwing the runtime error.

     object invocation = Interaction.CallByName(entry, "invoke", CallType.Method, null, null);

好的,让我在这里停下来注意一些事情。这在C#(.NET 4.5)中成功构建,但在调用行中引发参数不匹配的运行时错误。在我看来,有人只是把它放到三个单独的行(加载,入口点,调用)来演示它们正在做什么,因为我们可以用对象定义来创建一行。我从列出的2中添加和减去“nulls”,并且错误消息仍然存在,要么说它不带3个参数,要么我错误地没有参数。

在我几个小时前的问题中,一篇有用的帖子建议我(引用)“加载程序集(Reflection.Assembly.Load)然后检查Assembly.EntryPoint属性(MethodInfo)上的参数调用它的GetParameters方法。一旦你知道你在处理什么,那么你可以使用CallByName来启动它。“ (归功于用户TnTinMn)

所以在用稀疏的例子阅读在线文档大约两个小时后,我只想出这一行:

object loaded = System.Reflection.Assembly.Load(exe_bytes);

替换代码中加载的定义。在那之后,我完全不知道我在读什么或做什么! Assembly.Entrypoint,GetParameters,MethodInfo,哦,我的!基本上,我只想要“你需要多少参数?请打印到控制台!”翻译成C#.NET OO说。因为我完全迷失了。谢谢!

上述似乎是一个良好的开端,但解决方案的替代课程当然是受欢迎的。如果可以,请在答案中提供代码,因为我将能力从概念转换为OO编程的能力明显不足。

编辑:这可能与检查参数的数量有关吗?

 MethodInfo[] methods = BUT_WHAT_OBJECT_GOES_HERE.GetMethods();
        foreach (MethodInfo info in methods)
        {
            Console.WriteLine(info.Name);
        }

在我从中获取代码的示例中,方法GetMethods的对象是Program类。我尝试使用汇编对象exefile,它不会接受它。

0 个答案:

没有答案