如何获得有关DllImport属性的信息?
我使用单开发检查器检查包装本机dll的c# dll
using System.Runtime.InteropServices;
namespace MonoMac.foo
{
public class fooFramework
{
[DllImport ("/System/Library/Frameworks/foo")]
public static extern void NSfoo ();
}
}我试图使用System.Reflection在代码中“复制”检查器功能。在MethodInfo方法上获得一个NSfoo没有问题。如何获得这些(非自定义)属性?我认为
mymethodInfo.Attributes & MethodAttributes.PinvokeImpl将告诉我该方法是否包含在外部调用中。但是,如何获得更多信息,例如本机dll的路径?
编辑:
我使用的是Attribute.GetCustomAttributes(mymethodInfo)或mymethodInfo.GetCustomAttributes()。由于某种原因,返回的列表不包含任何类型为DllImport的属性。
显式地请求一个=(DllImportAttribute)mymethodInfo.GetCustomAttribute(typeof(DllImportAttribute)).是可行的:var dllImport dllImport
如果属性不是null,则"path“位于名为Value的属性中。
发布于 2022-07-12 18:04:15
由于extern始终是static,所以需要查找所有静态方法并根据GetCustomAttribute()方法的结果对它们进行过滤:
public class fooFramework
{
[DllImport ("/System/Library/Frameworks/foo")]
public static extern void NSfoo ();
}
...
public class MethodData
{
public MethodInfo MethodInfo { get; set; }
public DllImportAttribute Attribute { get; set; }
public string DllPath => Attribute.Value;
}
...
public static List<MethodData> GetDllImportMethods(Type classType)
{
var methods = classType.GetMethods(BindingFlags.Public | BindingFlags.Static);
var result = new List<MethodData>();
foreach (var methodInfo in methods)
{
var dllImportAttribute =
methodInfo.GetCustomAttribute(typeof(DllImportAttribute));
if (dllImportAttribute == null)
continue;
result.Add(new MethodData()
{
MethodInfo = methodInfo,
Attribute = (DllImportAttribute)dllImportAttribute
});
}
return result;
}
...
//Usage:
var methods = GetDllImportMethods(typeof(fooFramework));
Console.WriteLine(methods[0].DllPath); // /System/Library/Frameworks/foohttps://stackoverflow.com/questions/72956267
复制相似问题