从c#调用C ++ dll函数

时间:2012-09-17 04:22:12

标签: c# c++ dll

我有一个带有函数的c ++ dll项目(MsgHook.cpp)的解决方案: -

BOOL f_closeSEB()
{
    logg(fp, "\n\n");
    //TerminateProcess(hPiProcess->hProcess,0);
    SendMessage(hWndCaller,WM_DESTROY,NULL,NULL);
    logg(fp, "   SEB exit sequence, destroy window\n");
    //logg(fp, "Leave LLKeyboardHook() and return -1\n\n");
    return -1;
}

我试图通过以下方式从我的c#web服务项目中调用此函数: -

using System.Runtime.InteropServices;

    namespace closeSEB
    {
        partial class closeSEBService
        {
            /// <summary> 
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;

            public enum commands
            {
                CloseIt=255
            }

            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }

            [DllImport("MsgHook.dll", SetLastError = true)]
            public static extern void runRTS(string serviceName);

             protected override void OnCustomCommand(int command)
            {
              base.OnCustomCommand(command);
              if (command == (int)commands.CloseIt)
              {
                //Code to call msghook closeSEB function
                  runRTS("closeSEBService");
                  f_closeSEB(); 
              }
            }
            #region Component Designer generated code

            /// <summary> 
            /// Required method for Designer support - do not modify 
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                // 
                // closeSEBService
                // 
                this.ServiceName = "Service1";

            }

            #endregion

        }
    }

但是在编译器中,我收到的错误是名称f_closeSEB在当前上下文中没有退出。这不是通过C#调用DLL文件中定义的函数的正确方法吗?

2 个答案:

答案 0 :(得分:2)

你必须确保两件事:

  1. 正确编写DLLImport,如下面的示例所示

    [DllImport(“MsgHook.dll”,SetLastError = true)] public static extern bool f_closeSEB();

  2. 确保根据C#程序需要为x86或x64编译DLL“MsgHook.dll”。 .NET支持任何cpu ,但C ++不支持,因此请确保所需的类型。

  3. 有关详情,请参阅Calling Win32 DLLs in C# with P/Invoke上的MSDN文章。

答案 1 :(得分:0)

尝试声明

extern "C" BOOL f_closeSEB()
// function code goes here
MsgHook.cpp文件中的

。通过这种方式,f_closeSEB无法解压缩到.dll文件中。

您也可以使用某个工具(如CFF Explorer)检查生成的文件,以查看.dll的导出部分是否包含f_closeSEB

MsgHook.cpp中的代码看起来像C代码,因此您可以将'.cpp'文件重命名为'.c'并将其编译为C源代码。