在 C# 中以编程方式设置 dllimport

2023-11-24

我在用DllImport在我的解决方案中。
我的问题是我有同一个 DLL 的两个版本,一个是为 32 位构建的,另一个是为 64 位构建的。

它们都公开具有相同名称和相同签名的相同函数。 我的问题是我必须使用两个静态方法来公开这些方法,然后在运行时使用IntPtr大小来确定要调用的正确值。

private static class Ccf_32
{
    [DllImport(myDllName32)]
    public static extern int func1();
}

private static class Ccf_64
{
    [DllImport(myDllName64)]
    public static extern int func1();
}

我必须这样做,因为myDllName32 and myDllName64必须是恒定的,我还没有找到在运行时设置它的方法。

有谁对此有一个优雅的解决方案,这样我就可以摆脱代码重复和常量IntPtr尺寸检查。

如果我可以设置文件名,我只需要检查一次,就可以摆脱大量重复的代码。


我更喜欢使用加载库从 kernel32.dll 调用以强制从特定路径加载特定 DLL。

如果您将 32 位和 64 位 DLL 命名相同,但将它们放置在不同的路径中,则可以使用以下代码根据您运行的 Windows 版本加载正确的代码。您所需要做的就是致电示例DllLoader.LoadDll()在引用任何代码之前ccf类被引用:

private static class ccf
{
    [DllImport("myDllName")]
    public static extern int func1();
}

public static class ExampleDllLoader
{
    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
    private extern static IntPtr LoadLibrary(string librayName);

    public static void LoadDll()
    {
        String path;

        //IntPtr.Size will be 4 in 32-bit processes, 8 in 64-bit processes 
        if (IntPtr.Size == 4)
            path = "c:/example32bitpath/myDllName.dll";
        else
            path = "c:/example64bitpath/myDllName.dll";

        LoadLibrary(path);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中以编程方式设置 dllimport 的相关文章

  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 从 Excel 应用程序对象中查找位数(32 位/64 位)?

    是否可以从 Microsoft Office Interop Excel ApplicationClass 确定 Excel 是以 32 位还是 64 位运行 Edit该解决方案应该适用于 Excel 2010 和 Excel 2007 此
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • python基类如何判断子类是否重写了它的方法?

    这是我的猜测 但行不通 class BaseClass object def foo self return foo def bar self return bar def methods implemented self This doe
  • Java:优化哈希集以进行大规模重复检测

    我正在开发一个项目 需要处理大量推文 目标是在处理重复项时删除它们 我有推文 ID 它们以以下格式的字符串形式出现 166471306949304320 我一直在使用HashSet
  • 在 VBA 中重置列表框选择

    我试图在表单关闭时 重置 Excel VBA 中的列表框 目前 当我使用 userform1 hide 函数时 表单会消失 但是当我使用 show 函数再次打开它时 它仍然包含以前的选择 作为一个对此相对陌生的人 有人可以帮忙吗 列表框的代
  • 是否能够通过复制粘贴链接 URL 来下载 Github Actions 工件?

    我们正在做一个概念验证 研究 Github Actions 来为遗留系统的给定提交生成一个工件 然后我们需要在内部进一步处理它 所以我正在研究我们现在如何相对简单地做到这一点证明这是可行的 我们对拉链包装没问题 通过右键单击 操作 中作业页
  • 如何仅使用私钥(无助记词)将帐户导入 NEAR 钱包

    在这篇文章中 我将介绍如何仅使用您的私钥将帐户导入 NEAR 钱包 当您使用 CLI 或近 api js 创建帐户 或子帐户 并且只能访问私钥时 这非常有用 要导入帐户 只需单击此 URL 并替换YOUR ACCOUNT ID and YO
  • 强制 Visual Studio 在调试时始终“重建全部”

    编辑 基本上我需要的是 Visual Studio 在我进行调试时始终重建所有内容 我目前正在使用 Visual Studio 来编译我的汇编程序 使用 MASM 总的来说它工作正常 然而我遇到了一个恼人的问题 如果我包含一个像这样的文件
  • Google Chrome 扩展程序获取页面信息

    我正在制作一个 google chrome 扩展 我需要获取当前页面的 URL 和标题 我怎样才能实现这个目标 chrome tabs getSelected null function tab lt tab has all the inf
  • 如何使用 Iron Router 返回 404

    当我找到使用 IR 的 Meteor 应用程序中不存在的路线时 我会收到200带有 HTML 的响应 当在浏览器上呈现时 在控制台上显示 js 错误 说明No route found for path aRoute 怎样才能让它返回404
  • -[UIApplication _runWithMainScene:transitionContext:completion:] 中断言失败,

    我仅在 iOS9 中收到以下错误 这是我的代码 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOpti
  • 带有 UIViewController 的插件

    有人可以向我解释 Cordova iOS 插件的生命周期吗 特别是 我有一个正在尝试开发的插件 其中包含UIView 以及相关的UIViewController 我如何获得科尔多瓦UIView从我的扩展CDVPlugin类 这样我就可以将我
  • Java中获取二维数组的数组长度

    我需要获取行和列的二维数组的长度 我已经使用以下代码成功完成了此操作 public class MyClass public static void main String args int test test new int 5 10 i
  • 是否可以使用 HttpModule 删除一些发布数据?

    我正在将一个旧的经典 asp 网站转换为 asp net 该应用程序基本上是针对给定用户组的工具集的扩展 但它由外部供应商托管 为了执行到此应用程序的无缝传输 它会发布一些 xml 数据 该数据会触发 潜在危险的 Request Form
  • Linq-to-Sql SubmitChanges 不更新字段...为什么?

    我发布了这个question昨天晚上 这让我发现了一个huge问题 我的数据库中有一个名为 单位 的十进制列 每当我将该列的值设置为非零时 并且 SubmitChanges 列都会更新为新值 如果我尝试将该列的值设置为零 则 SubmitC
  • 如何fork JVM? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 类似 C 的 Fork 我想知道如何从 JDK 派生一个子 JVM 或者甚至可以这样做吗 一些框架 例如 hadoop 会为特定任务创建一个子 JVM 因此请对这个主题进行一些说明 Than
  • 如何使用 EPPLus 修改图表系列?

    我想问一下如何使用 EPPLUS 库更新 Excel 中现有图表的系列值 我还不知道该怎么做 我已经成功创建图表 但仍然无法更新系列值 任何人都可以给我提供一些示例代码或参考链接吗 抱歉这么晚才回答 在搜索其他内容时看到您的帖子 如果图表有
  • vscode "python.jediEnabled": false,显示为未知配置设置

    这是settings json文件代码 python autoComplete addBrackets true python linting enabled true python pythonPath C Program Files P
  • 一次一密,加密解密

    我正在尝试学习密码学并且一直在尝试这个练习 编写一个程序 最好是Java 生成一次性的pad 这是所有文件中比较大的一个 随机数据 例如 1 MB 该程序还应该能够根据以下内容加密 解密文件 生成一次性本 提示 使用以下测试向量来检查您的程
  • 使用 C# 将日期时间格式转换为 SQL 格式

    我正在尝试从 C 保存当前日期时间格式并将其转换为 SQL Server 日期格式 如下所示yyyy MM dd HH mm ss所以我可以用它来我的UPDATE query 这是我的第一个代码 DateTime myDateTime Da
  • 找不到 -lboost_system 的库

    我使用 macports 安装了 boost 这些文件似乎位于 opt local include boost 中 我的 makefile 不再工作并且出现以下错误 Undefined symbols boost system generi
  • 在 C# 中以编程方式设置 dllimport

    我在用DllImport在我的解决方案中 我的问题是我有同一个 DLL 的两个版本 一个是为 32 位构建的 另一个是为 64 位构建的 它们都公开具有相同名称和相同签名的相同函数 我的问题是我必须使用两个静态方法来公开这些方法 然后在运行