加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 实现类似机制的[DllImport]

发布时间:2020-12-15 22:06:23 所属栏目:百科 来源:网络整理
导读:这是我的问题:在PCL库中,我将从C DLL调用非托管代码.该DLL有两个版本(x86和x64),出于性能原因,应根据嵌入PCL库的平台引用正确的库. 由于[DllImport]属性需要一个常量字符串作为库名,因此这种非常方便的方式使得无用,因为要在运行时确定正确的库.手动加载函
这是我的问题:在PCL库中,我将从C DLL调用非托管代码.该DLL有两个版本(x86和x64),出于性能原因,应根据嵌入PCL库的平台引用正确的库.

由于[DllImport]属性需要一个常量字符串作为库名,因此这种非常方便的方式使得无用,因为要在运行时确定正确的库.手动加载函数有一些“hubby”方法(LoadLibrary,GetProcaddress和GetDelegateForFunctionPointer),但我会让程序员更方便.

因此,声明外部函数不是问题.好吧,C#编译器检测到外部并担心这个事实,即在缺少[DllImport]属性时,加载类型时可能无法解析外部.好的,我定义了一个属性[MyImport]并将其放在外部声明和宾果游戏中,至少编译器很高兴.

在运行时,我当然得到一个TypeLoadException因为我的外部确实没有解决.这提出了两个问题:

1)为什么编译器对任何属性都满意?
关于使用该属性以解决挂起的外部问题,加载器是否有任何魔法?这可以通过提供由属性实现的接口直接完成.这样,运行时将查找外部搜索的属性,以实现那些实现“魔术”接口的属性.

2)如何以可以实现自己的加载器的方式捕获TypeLoadException?
该加载器将迭代给定类型的所有外部,读取[MyImport]属性并以这种方式解析外部.

如果有可能实现这两个想法中的一个或者是否有其他解决方案可以解决上述问题?

我虽然欣赏英语课,但实际上并不是我要求的:-))

基督教.

解决方法

实际上我选择了汉斯提到的解决方案,在评论部分进一步说明.

正如他所提到的,整个问题是一个部署问题,而不是通过变通方法开发来解决的问题.所以,我给了两个平台版本相同的名称,让它们驻留在不同的目录中 – 像这样:

SystemTera.MyPCL.dll
x86SystemTera.Platform.dll
x64SystemTera.Platform.dll

启动时,我将加载程序指向正确的平台版本:

public static class Platform
{
    [DllImport("kernel32.dll",SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string pathName) ;

    public static void Setup()
    {
        if (Environment.Is64BitProcess)
            SetDllDirectory("./x64/") ;
        else // default Win32
            SetDllDirectory("./x86/") ;
    }
}

当我进一步参考平台库时,加载器/抖动执行正确的工作:

public class MyClass
{
    [DllImport("SystemTera.Platform.dll")]
    static extern void MyPlatformFunction() ;

    public void DoTheJob()
    {
        MyPlatformFunction() ;
    }
}

使用框架提供的现有概念,这是一个很好的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读