【问题标题】:Finding the entrypoint after converting C++ exe to dll and use it into C#将 C++ exe 转换为 dll 并在 C# 中使用后找到入口点
【发布时间】:2015-12-10 22:46:40
【问题描述】:

我需要将 C++ File.exe 源代码转换为 File.dll 。为此,我将此源的配置类型更改为动态库 (.dll),Visual Studio 构建 File.dll 而不是 File.exe。

现在我尝试将此 File.dll 用于我的 C# 项目。这个 dll 入口点是这样的:

   int wmain(int argc, wchar_t* argv[])
    {
        // codes
    }

在此之后,我将参数传递给 CMD 中的 File.exe,例如:

   File.exe -l  -a "This is first arg !"

但现在事情变得复杂了。我知道在 C# 代码中使用 C++ dll 就像:

        [DllImport(@"File.dll" , EntryPoint = "wmain")]
    private static extern int wmain(int a , string arg);

我的问题:

1.下面的代码是错误的,因为我不知道如何将 (wchar_t* argv[]) 声明为 C# 变量?!

2.如果我在 C# 中运行以下代码,它会给出:'Unable to find an entry point named 'wmain' in DLL 'File.dll'.' 所以看来我应该先做某事以明确 C# 的入口点。那是什么?!

更新 1: 似乎this link 对我的第一个问题有相同的场景,但不同之处在于我使用数组并且找不到与 (wchar_t) 相同的类在 c# 中。

【问题讨论】:

  • @JamesRoot 它是相似的,但不同的是我的代码是一个数组!那么如何在同一场景中传递数组?!
  • 我建议更新您的问题以引用相关的问题/答案并说明为什么它不同以避免意外作为重复关闭
  • this 回答建议您可以将其称为指向指针的指针,而不是指针数组。
  • 最后,最好选择一个不同的名称,因为wmain 对 C++ 工具链具有特殊意义。

标签: c# c++ dll entry-point


【解决方案1】:
[DllImport(@"File.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]

我并没有真正使用 C#,但this 的答案有上面这行可能会解决第二个问题。

关于第一个问题,您必须测试下一个问题是否有效,但由于IntPtr 与指针大小相同,它应该适用于wchar_t* argv[]也许。哦,差点忘了,你可能需要unsafe 关键字。

public static extern int wmain(int argc, MarshalAs(UnmanagedType.LPArray)] IntPtr[] argv);

我从here得到这个想法。

同样,我几乎从未使用过 C#,但希望这可以帮助您指明正确的方向。

【讨论】:

  • 感谢您的宝贵时间。你可能是对的,但我怎么能把 wchar_t 数据作为 IntPtr !!!但无论如何,再次感谢你。
  • 你有一个IntPtr 数组,所以每个IntPtr 将对应一个wchar_t*。由于IntPtr 被设计为足够大的整数来存储指针,并且从指针到整数的reinterpert_cast 定义明确,我假设IntPtr 值将被解释为wchar_t*。当然,只要确保 wmain 要么不使用 argv,要么在传递它之前填充数组。
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多