如何从 Win32 进程调用 .NET DLL?

2024-03-17

在 Win32 进程中使用 .NET DLL 时有哪些选项? 我基本上需要使用 Win32 进程中的 C# DLL。

我现在有一个可能的解决方案,需要将 C# DLL 添加到 GAC(使用 RegAsm.exe),然后通过 COM 包装调用来调用 C# DLL。 然而,这个解决方案相当沉重。它要求将 .NET DLL 添加到GAC https://msdn.microsoft.com/en-us/library/yf1d93sz.aspx在所有应该运行此 Win32 进程的计算机上。

是否可以在不打电话的情况下做到这一点RegAsm在能够使用 C# DLL 之前?


您可以将免注册 COM 与 .NET COM 组件一起使用 - 请参阅here http://msdn.microsoft.com/en-us/library/eew13bza(VS.71).aspx.

另一种选择是使用 C++/CLI 作为桥梁。人们最熟悉的是使用它来包装非托管 API 以公开给托管代码,但它实际上是双向的 - 可以使用以下方式进行编译/clr,但仍产生一个.dll具有普通非托管导出的程序集,可以像往常一样从非托管代码调用。这是一个非常简单的例子System::String::ToUpper那样:

// compile with cl.exe /clr /LD wrapper.cpp ole32.lib

#include <windows.h>

__declspec(dllexport)
wchar_t* ToUpper(const wchar_t* wcs)
{
    System::String^ s = gcnew System::String(wcs);
    array<wchar_t>^ chars = s->ToUpper()->ToCharArray();

    size_t size = chars->Length * 2;
    wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2);
    pin_ptr<wchar_t> src = &chars[0];
    memcpy(dst, src, size);
    dst[chars->Length] = 0;
    return dst;
}

这将产生wrapper.dll- 混合托管/非托管程序集 - 以及导出库wrapper.lib。后者可以在纯本机应用程序中使用,如下所示:

// compile with cl.exe test.cpp ole32.lib wrapper.lib
// note, no /clr

#include <stdio.h>
#include <windows.h>

wchar_t* ToUpper(const wchar_t* wcs);

int main()
{
    wchar_t* s = ToUpper(L"foo");  
    wprintf(L"%s", s);
    CoTaskMemFree(s);
}

实际上,它将 CLR 运行时加载到调用进程中(除非它已经加载到那里)并透明地从本机代码分派到托管代码 - 所有的魔法都是由 C++/CLI 编译器完成的。

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

如何从 Win32 进程调用 .NET DLL? 的相关文章

随机推荐

  • 正在从 CakePHP URL 中删除 ID?

    大家好 正在开发一个新的 Cake 应用程序 想知道是否有办法从 Cake 中删除 ID in URL 路由 也许通过某种方式在 POST 中传递 ID 将 ID 作为 URL 参数传入似乎非常粗制滥造且不安全 谢谢 劣质 在 URL 中包
  • 根据用户组限制 S3 资源

    我有一个网络应用程序 用户 通过 Cognito 使用 ID 令牌 JWT 登录 可以从 S3 上传 下载文件 用户应仅访问与其组织相关的 S3 资源 为此 我正在考虑按组织分离 S3 路径 arn aws s3 my bucket org
  • 如何使 Kotlin“内部”​​对象可供测试访问?

    我的项目使用多个 Gradle 源集作为其生产代码库 而不仅仅是main domain dal rest test dbUnitTest 事实证明 这对于限制依赖性和强制关注点分离非常有用 然而它有一个缺点 我们无法使用以下方式访问类或方法
  • Firebug 的“网络”选项卡没有显示任何内容?

    我通常运行 Fiddler 来监控网络流量 现在使用 Mac 机器 我认为Firebug的net选项卡可以显示通过AJAX获取的流量 net选项卡已启用 但是 如果我尝试 google com 并输入一些内容 它的 google sugge
  • 根据屏幕宽度更改 JavaScript 中的 a 标签属性

    我试图使用媒体查询更改 a 标签的属性 但我发现带有超链接的媒体纯粹是建议性的 因此 替代方法是使用 JavaScript 但我似乎无法让 screen width 正常工作 JavaScript function adjustHeight
  • Sum(Case when) 导致选择的多行

    我有一张巨大的客户订单表 我想运行一个查询来按 user id 按月列出过去 13 个月的订单 我现在所拥有的 如下 可以工作 但不是只为每个 user id 列出一行 而是为 user id 的每个订单列出一行 例如 一个用户一生中总共有
  • 如何重启Android模拟器并保留系统数据

    Android模拟器关机时是否可以保留系统数据 不是SD卡数据 我的具体问题是我正在尝试将新的根证书导入 system etc security cacerts bks文件 但这需要重新启动 当我重新启动模拟器时 文件将恢复到原始状态 该文
  • 如何解决Java错误“pool-1-thread-xxxx”java.lang.OutOfMemory

    我搜索了有关此问题的帖子 但没有看到像我这样的情况 我的 java 控制台显示错误消息 pool 1 thread xxxx java lang OutOfMemory如下图 红线 CPU 使用率 绿线 内存使用情况 我增加了内存6G to
  • 如何在access中搜索2个日期和时间?

    我的访问字段中有MyDate and myTime 我的日期格式 16 09 2010 00 00 00 我的时间格式 16 09 2010 04 27 00 我需要在之间搜索date 01 01 2010 and time 12 50 0
  • 自定义命名空间事件将不起作用

    我正在尝试让自定义命名空间事件按此处所述工作 http docs jquery com Namespaced Events http docs jquery com Namespaced Events 但我一定错过了一些东西 因为除非命名空
  • UISlider 在 iOS7 中没有动画

    当我从 iOS 6 切换到 iOS 7 设计时 我注意到使用该方法setValue animated 不再为滑动过程设置动画 有其他人遇到过这个问题并找到解决方案吗 我将添加一些代码来表明我没有做任何复杂的事情 Variable decla
  • C++ 代码中“&”运算符的意义

    我看到一些这样的代码 void testCase2 int variant if variant 0x1 return 什么是 if语句中的运算符意思是 为什么要使用 是按位与运算符 给定两个整数操作数 它对每个位位置执行 AND 运算 即
  • 让 WAMP 在 Windows 启动时自动启动(无需登录或任何 UAC 干扰)

    我希望在打开计算机时启动 WAMP 理想情况下 它甚至无需用户登录即可启动 我已将 WAMP 添加到注册表中的启动项中 但用户需要登录 而 UAC 仍在发挥其烦人的作用 有没有一种方法可以在不登录或UAC干扰的情况下完成此任务 Thanks
  • 如何在iphone sdk中制作跑分动画

    我希望在 xcode 中为我的 iPhone 应用程序做一个运行分数动画 这样每当我将分数增加一个整数 ScoreAdded 时 分数就会运行到新分数 而不是更新到新分数 我尝试了一些带有 sleep 的 for 循环 但没有可用 所以我想
  • VS 2015 ASP.NET Web API (EF6) 和 Xamarin 启用迁移失败

    我正在开发一个项目 该项目将使用 ASP NET Web API 作为数据服务 并使用 Xamarin 便携式应用程序作为客户端 我尝试在 Web 应用程序中启用迁移 但收到以下错误 Enable Migrations enableauto
  • JAVA:为什么带负号的字节的二进制文字被视为整数类型?

    我无法理解以下行为 我试图使用二进制文字声明字节掩码 byte mask 0b1111 1111 但这是不可能的 因为我收到以下错误消息 类型不匹配 无法从 int 转换为 byte 最有趣的是 当我尝试直接以十进制表示形式声明掩码时 by
  • 如何知道哪个 git 分支触发了 jenkins 作业

    我有一个管道 Jenkins 作业 它按预期工作 并使用选项进行配置 GITScm 轮询的 GitHub 挂钩触发器 用于在任何推送到 git 存储库时自动构建 我已将这个 Jenkins URL 挂接到多个 git repo 的说repo
  • Python对二维列表中具有相同第一个值的元素求和

    我正在尝试找到一种有效的方法来执行以下操作 我有这个样本 sample no 2 6 ja 5 7 no 4 9 ja 10 11 ap 7 12 并且需要 res no 6 15 ja 15 18 ap 7 12 即对第一个元素相同的子列
  • 当使用浮点数和双精度数时,c 中的 -0.0000 是多少?

    include
  • 如何从 Win32 进程调用 .NET DLL?

    在 Win32 进程中使用 NET DLL 时有哪些选项 我基本上需要使用 Win32 进程中的 C DLL 我现在有一个可能的解决方案 需要将 C DLL 添加到 GAC 使用 RegAsm exe 然后通过 COM 包装调用来调用 C