首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DllImportAttribute使用System.Reflection?

如何使用DllImportAttribute使用System.Reflection?
EN

Stack Overflow用户
提问于 2022-07-12 17:32:34
回答 1查看 67关注 0票数 1

如何获得有关DllImport属性的信息?

我使用单开发检查器检查包装本机dll的c# dll

代码语言:javascript
复制
using System.Runtime.InteropServices;
namespace MonoMac.foo
{
 public class fooFramework
 {
  [DllImport ("/System/Library/Frameworks/foo")]
  public static extern void NSfoo ();
 }
}

我试图使用System.Reflection在代码中“复制”检查器功能。在MethodInfo方法上获得一个NSfoo没有问题。如何获得这些(非自定义)属性?我认为

代码语言:javascript
复制
mymethodInfo.Attributes & MethodAttributes.PinvokeImpl

将告诉我该方法是否包含在外部调用中。但是,如何获得更多信息,例如本机dll的路径?

编辑:

我使用的是Attribute.GetCustomAttributes(mymethodInfo)或mymethodInfo.GetCustomAttributes()。由于某种原因,返回的列表不包含任何类型为DllImport的属性。

显式地请求一个=(DllImportAttribute)mymethodInfo.GetCustomAttribute(typeof(DllImportAttribute)).是可行的:var dllImport dllImport

如果属性不是null,则"path“位于名为Value的属性中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-12 18:04:15

由于extern始终是static,所以需要查找所有静态方法并根据GetCustomAttribute()方法的结果对它们进行过滤:

代码语言:javascript
复制
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/foo
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72956267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档