【问题标题】:c# create and attach dll to projectc# 创建dll并将其附加到项目
【发布时间】:2014-07-11 19:34:43
【问题描述】:

我想在 C# 中创建一个类库项目并将其附加到一个过程中。

我已经在 C++ 中做过这个,我的代码是

#include <windows.h>
void Thread()
{
// here i just do my stuff
}
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    if(reason==DLL_PROCESS_ATTACH)
    {
         CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Thread, 0, 0, 0);
    }
    return 1;
}

这对我来说效果很好。

在 C# 中可以做到这一点吗?

谢谢,希望我能找到答案并接受。

【问题讨论】:

  • .Net 进程还是要托管 CLR?
  • 麦克斯韦我不太明白你的评论。我想为游戏制作一个模组。使用上面的 C++ 代码,我得到一个 .dll 文件,将其添加到游戏文件夹中,然后附加 dll 并启动该线程。我想用 C# 做同样的事情。
  • 我的意思是:都是 c# 还是 c++ 和 c# 的混合?
  • 我想用 C# 做所有事情。
  • @Paul 模块初始化在 C# 中不受支持 - 您需要使用 C++/CLI...

标签: c# c++ multithreading winapi dll


【解决方案1】:

C# 没有像DllMain 这样的机制,您可以在从可执行文件中引用或使用代码时执行代码。可执行文件需要显式调用(或至少使用)库中的类型的方法,以便执行代码。

但是,如果您知道要使用库中的某个类型,则可以“作弊”并通过将其放置在该类型的静态构造函数中来启动线程。这将导致它在第一次使用该类型时或之前执行。

话虽如此,如果您正在编写将使用此 C# 库的 exe,您只需调用类型上的方法即可开始您的线程并开始您的工作。

【讨论】:

  • 不工作...我将库保存为 .DLL 文件(我做了 F6),将 DLL 复制到我要加载它的游戏文件夹(GTA)。当我开始游戏时,我没有听到哔哔声......如果我用 C++ 创建一个 DLL 并且问题中的代码它可以工作......
【解决方案2】:

关注here的讨论。

给你的类一个静态构造函数并在那里进行初始化。 它会在任何人第一次调用静态方法或属性时运行 你的类或构造你的类的一个实例。

【讨论】:

【解决方案3】:

你可以使用module initializers。不幸的是,C# 不支持它们。您必须注入 IL,例如使用 Module InitializerFody 之类的工具

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多