我已经删除了第一次提出这个问题的尝试,因为我没有完全掌握语义。现在我好多了。基本上这是问题所在。我有一小块在线演示代码我正在分析,它展示了如何从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,它不会接受它。