dll - 如何使用命令行参数/ENTRY 在 C++/CLI DLL 中定义入口点

标签 dll c++-cli

cl.exe 中有一个选项可以使用命令行属性/ENTRY 在 DLL 中定义自定义入口点。不幸的是,它没有提供如何使用它的示例。

http://msdn.microsoft.com/en-us/library/f9t8842e%28v=vs.100%29.aspx

我创建了支持/CLR 的托管 C++ DLL,并用“开始”替换了主函数的名称:

int Start(int argc, char *argv[])
{
    return 0;
}

然后我尝试使用这个 BAT 命令从命令行编译这个 DLL:
"c:\Program Files\Microsoft Visual Studio 12.0\VC\bin\cl.exe" ^
    /clr /Fo /Z7 /D "NDEBUG" ^
    /ENTRY:Start ^
    "..\Links\Links.cpp"

不幸的是,我收到此错误:
LNK1561: Entry point must be defined

问题 :我到底应该将什么作为/ENTRY 参数传递?

编辑 :正如下面 Hans 的评论中提到的,函数曾经是 DLL 中的入口点需要有另一个签名,所以我更正了上面的例子。下面介绍的函数是 EXE 文件的入口点示例,特别是因为它的参数中有托管类型。
int Start(array<String ^> ^ argc)
{
    return 0;
}

最佳答案

指定 /ENTRY在托管程序集中是一个非常糟糕的主意,因为现在 C++ 运行时库中的所有 .NET Framework 支持代码都不会被执行。全局 C++ 对象的初始化程序也没有机会运行。并且您可能会在工作线程上发生内存泄漏,因为 C++ 运行时库足够智能,可以在需要时执行线程本地初始化,但是因为它不接收线程分离事件,所以无法进行清理。另一方面,C++/CLI 程序集总是动态链接到运行时 DLL,因此至少该库 DllMain将接收线程通知,并且运行时本身使用的资源不会泄漏。

只需离开 DllMainCRTStartup由库单独提供的入口点,并提供一个名为 DllMain 的函数库入口点将调用它。

MSDN 上有大量关于 C++/CLI 托管程序集中初始化代码的文档:

  • Initialization of Mixed Assemblies

  • 要从中带走的重要事情之一是 DllMain签名(这又不是实际的入口点,它是从库提供的入口点调用的),是
    BOOL WINAPI DllMain(
      _In_  HINSTANCE hinstDLL,
      _In_  DWORD fdwReason,
      _In_  LPVOID lpvReserved
    );
    

    关于dll - 如何使用命令行参数/ENTRY 在 C++/CLI DLL 中定义入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415209/

    相关文章:

    c++ - std::error_category 可以跨 dll 使用吗?

    c - 使用 VS2010 构建的可执行文件在 System32 中找不到 DLL

    c# - 在 C# 中使用运行时确定的 C++ DLL

    arrays - C++/CLI 类中不允许使用数组?

    c++ - 将dll导入C++程序

    c# - 从托管 C++/CLI 使用 C# 扩展方法

    c# - 在 C# 中调试 c++ dll

    c# - .NET 中的 DLL 可以使用不同的扩展名吗?米勒?

    c# - c++\cli 项目依赖的 c++ dll 未复制到 c# 输出目录

    c - 尽管选项正确,静态链接仍不适用于 C++/CLI(未解析的外部符号)