在 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 的相关文章

  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 无法在更新面板中找到上传的文件

    aspx
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 具有长期运行对象上下文的实体框架

    我对 WinForms 我敢说 WPF 中的 Linq to SQL 的主要烦恼之一是缺乏对长时间运行的数据上下文的支持 请参阅here http blogs msdn com dinesh kulkarni archive 2008 04
  • 增加超时时间

    我必须增加超时时间 以下是我的代码 Private Function GetConnectionInstance As SqlConnection Dim objConn As SqlConnection Dim strConnection
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 使用 boost::iterator_facade<>

    我有一个链表结构 struct SomeLinkedList const char bar int lots of interesting stuff in here DWORD foo SomeLinkedList pNext 它是现有
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • 最小对的总和

    Given 2N点 in a 2D plane 你必须将它们分组为N pairs使得所有对的点之间的距离的总和是最小可能值 所需的输出只是总和 换句话说 如果a1 a2 an分别是第一对 第二对 和第 n 对点之间的距离 则 a1 a2 a
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 使用std::begin()、std::end()将ArrayXd转换为stl向量,

    在我看来我应该能够使用std begin and std end 转换ArrayXd to std vector
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • 序列化时如何跳过 xml 声明?

    我正在尝试输出一个没有 xml 头的 xml 文件 例如 我试过 Type t obj GetType XmlSerializer xs new XmlSerializer t XmlWriter xw XmlWriter Create c
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数
  • 散列 hash_hmac 时,Convert.ToChar(0) 散列结果与 PHP 中的 chr(0) 不同的字符串

    我在 PHP 中有一个字符串 它被转换为字节数组并进行哈希处理 转换为字节数组的字符串如下所示 G 字符 0 便便 我需要 C 中的等效字节数组 这样我才能得到相同的哈希值 编辑 这是完整的问题 生成的哈希值不同 PHP api secre

随机推荐

  • 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 位构建的 它们都公开具有相同名称和相同签名的相同函数 我的问题是我必须使用两个静态方法来公开这些方法 然后在运行