在Windows窗体应用程序中使用库

时间:2014-10-13 14:24:57

标签: c++-cli pinvoke

我需要在Windows窗体应用程序中使用WinSparkle库。我有包含库头 - <winsparkle.h>并已放置DLL导入代码。我想Dll导入代码是C#样式。如何将其转换为C++ .Net样式?

   // AutoUpdate.cpp : main project file.

    #include "stdafx.h"
    #include "Form1.h"
    #include <winsparkle.h>
    using System;
    using System::Runtime::InteropServices;


    using namespace AutoUpdate;

    namespace AutoUpdate // YOUR NAMESPACE CAN GO HERE
    {

**//    C# lines**
        class WinSparkle
        {        
            // Note that some of these functions are not implemented by WinSparkle YET.
            [DllImport("WinSparkle.dll", CallingConvention=CallingConvention.Cdecl)]
            public static extern void win_sparkle_init();
            [DllImport("WinSparkle.dll", CallingConvention=CallingConvention.Cdecl)]
            public static extern void win_sparkle_cleanup();
            [DllImport("WinSparkle.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
            public static extern void win_sparkle_set_appcast_url(String url);
            [DllImport("WinSparkle.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)]
            public static extern void win_sparkle_set_app_details(String company_name,
                String app_name,
                String app_version);
            [DllImport("WinSparkle.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
            public static extern void win_sparkle_set_registry_path(String path);
            [DllImport("WinSparkle.dll", CallingConvention=CallingConvention.Cdecl)]
            public static extern void win_sparkle_check_update_with_ui();
        }
    }


    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
        // Enabling Windows XP visual effects before any controls are created
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        // Create the main window and run it
        Application::Run(gcnew Form1());
        return 0;
    }

1 个答案:

答案 0 :(得分:0)

你似乎在这里感到有些困惑。

您当然可以使用混合模式C ++ / CLI程序集来完成此操作。您将包含头文件并将lib文件传递给链接器。然后你可以直接调用这些函数,因为它们是在头文件中声明的。您需要从C ++ / CLI程序集调用函数,或者通过托管的ref类公开所需的任何内容以供C#代码使用。

但是,您链接到的文档并未建议此路线。它建议根本没有C ++ / CLI和纯C#p / invoke解决方案。这似乎是最简单的方法。

我建议您删除C ++ / CLI层,而是使用纯C#p / invoke。请严格遵循您链接的说明。从标题为托管代码/ .NET / C#应用程序的部分开始。