使用 .NET Core 直接从 C# 调用 C++(主机)方法
Call C++ (host) methods directly from C# using .NET Core
将 .NET Core 嵌入到 C++ 应用程序中,您可以像 this tutorial with this sample 中描述的那样调用托管方法。您甚至可以将函数指针作为参数发送给托管代码以回调主机。
但是有什么方法可以不使用回调直接调用非托管方法吗?使用 Mono,您可以使用 P/Invoke 和 DllImport("__Internal")
来实现这一点,它们将直接在主机程序集中搜索符号。因此,通过这种方式,您可以将 C++ 功能公开给 C#,并将后者用作脚本语言。 有没有办法用 .NET Core 完成同样的事情?
我已经通过创建入口点然后使用反射调用方法解决了这个问题。
这是一个例子:
using System;
using System.Reflection;
public class MyType
{
public string CallMe(int i, float f)
{
return $"{i} and {f}";
}
}
class Program
{
public static string CallArbitraryMethod(string typeName, string methodName, string[] paramNames, object[] arguments)
{
// create the type
var type = Type.GetType(typeName);
if (type == null) return null;
// create an instance using the default constructor
var ctor = type.GetConstructor(new Type[0]);
if (ctor == null) return null;
var obj = ctor.Invoke(null);
if (obj == null) return null;
// construct an array of parameter types
var paramTypes = new Type[ paramNames.Length ];
for(int i=0; i<paramNames.Length; i++)
{
switch(paramNames[i].ToUpper())
{
case "INT": paramTypes[i] = typeof(int); break;
case "FLOAT": paramTypes[i] = typeof(float); break;
// etc.
default: return null;
}
}
// get the target method
var method = type.GetMethod(methodName, paramTypes);
if (method == null) return null;
// invoke and return
return (string)method.Invoke(obj, arguments);
}
static void Main(string[] args)
{
var result = CallArbitraryMethod("MyType", "CallMe", new string[] {"int", "float"}, new object[] {5, 10.5f});
Console.WriteLine($"{result}");
}
}
更多信息on this GitHub issue。
将 .NET Core 嵌入到 C++ 应用程序中,您可以像 this tutorial with this sample 中描述的那样调用托管方法。您甚至可以将函数指针作为参数发送给托管代码以回调主机。
但是有什么方法可以不使用回调直接调用非托管方法吗?使用 Mono,您可以使用 P/Invoke 和 DllImport("__Internal")
来实现这一点,它们将直接在主机程序集中搜索符号。因此,通过这种方式,您可以将 C++ 功能公开给 C#,并将后者用作脚本语言。 有没有办法用 .NET Core 完成同样的事情?
我已经通过创建入口点然后使用反射调用方法解决了这个问题。
这是一个例子:
using System;
using System.Reflection;
public class MyType
{
public string CallMe(int i, float f)
{
return $"{i} and {f}";
}
}
class Program
{
public static string CallArbitraryMethod(string typeName, string methodName, string[] paramNames, object[] arguments)
{
// create the type
var type = Type.GetType(typeName);
if (type == null) return null;
// create an instance using the default constructor
var ctor = type.GetConstructor(new Type[0]);
if (ctor == null) return null;
var obj = ctor.Invoke(null);
if (obj == null) return null;
// construct an array of parameter types
var paramTypes = new Type[ paramNames.Length ];
for(int i=0; i<paramNames.Length; i++)
{
switch(paramNames[i].ToUpper())
{
case "INT": paramTypes[i] = typeof(int); break;
case "FLOAT": paramTypes[i] = typeof(float); break;
// etc.
default: return null;
}
}
// get the target method
var method = type.GetMethod(methodName, paramTypes);
if (method == null) return null;
// invoke and return
return (string)method.Invoke(obj, arguments);
}
static void Main(string[] args)
{
var result = CallArbitraryMethod("MyType", "CallMe", new string[] {"int", "float"}, new object[] {5, 10.5f});
Console.WriteLine($"{result}");
}
}
更多信息on this GitHub issue。