【问题标题】:Using another langage in C++在 C++ 中使用另一种语言
【发布时间】:2018-07-30 09:47:02
【问题描述】:

我需要使用一个名为 ma​​iljet 的 API,但这个 API 仅适用于除 C++ 之外的几乎所有语言(php、python、ruby、java、node.js , ES2015, go 和 C#)。
所以我想知道,由于 C# 不是二进制 api,而是完整的 C# 代码,是否可以集成 C#将代码转换为 C++ 一种(或另一种列出的语言)。
谢谢!

【问题讨论】:

  • 为什么要集成一些东西?您可以为 API 编写自己的 C++ 客户端。
  • 可能会检查这个 [这里](stackoverflow.com/questions/13293888/…)
  • 阅读有关将 C# 与 Microsoft 的 C++ 链接的信息。如果您想将 C# 库导入“非 Microsoft”C++,您可以创建一个 Visual C++ 库并尝试将其链接到您的 C++ 代码。
  • 我同意 Reniuz 的观点:如果您只是想做简单的发送消息,那么从执行 JSON 的 C++ REST 库开始会更容易。如果您使用的是完整的 API,那么它可能值得集成,但这并不容易。
  • C++ 忽略了其他语言。有可以使用的库和接口。

标签: c# c++ mailjet


【解决方案1】:

Mailjet 提供标准的 JSON/HTTP(S) Web API,可用于提供 HTTP 和 JSON 支持的任何语言(通过使用库或自己编码这些协议或格式)。您提到的那些语言仅仅是 Mailjet 为其提供包装的语言。 C++ 将允许您很好地使用 API,使用 C# 包装器并从 C++ 调用它会非常低效。只需使用一个支持 HTTP 和一个支持 JSON 的 C++ 库就可以了。使用这些来根据 Mailjet 规范对 API 调用进行编码,例如使用正确的 HTTP 标头和 JSON 正文格式构建 HTTP 请求并调用 API。有很多这样的 C++ 库可用,任何体面的都可以。

【讨论】:

    【解决方案2】:

    你可以做到。从您的 C# 代码创建一个 DLL 文件并从 C++ 代码调用 api。有一个选项,请参阅下面的链接。

    https://support.microsoft.com/en-gb/help/828736/how-to-call-a-managed-dll-from-native-visual-c-code-in-visual-studio-n

    【讨论】:

      【解决方案3】:

      尝试编写小 Python 脚本并使用 Python interactive shell 运行它。

      python -i -u
      

      使用 Qt5 很容易。只需从该答案中复制code

      【讨论】:

        【解决方案4】:

        在 Visual Studio 中,您可以使用 C++ 项目中的 C# 代码,使用 CLR公共语言运行时)。

        打开项目属性

        • 进入配置管理器->常规下的左侧树视图。
        • Project Default 下的右侧网格中,找到 Common Language Runtime Support
        • 如果是标准 C++ 项目,默认为:No Common Language Runtime Support,您应该将其更改为:Common Language Runtime Support (/clr)
        • 在 VS17 中,您还应该将 配置属性->C/C++->语言 一致性模式更改为没有

        CLR 是一个可用于结合 .Net 和 C++ 的层。 C++ 语法相同,.Net 语法略有不同。

        • 添加 .Net 项目或 DLL 作为对 CLR 项目的引用。
        • .Net 命名空间分隔符 - 使用 :: 而不是 . 作为分隔符。
        • .Net 类必须用 ^ 声明以指示 .Net 引用。例如String^ 是.Net String 类。
        • 使用gcnew 而不是new 创建.Net 实例。喜欢String^ s = gcnew String();
        • 字符串需要从 c++“翻译”到 .Net 并返回。

        混合代码的简短示例:

        using namespace System;  
        using namespace System::Runtime::InteropServices;  
        
        #include <iostream>
        using namespace std;
          
        int main() {  
           String ^ str = gcnew String("Abcde");  
        
           Console::WriteLine(str);  //use .Net to print to screen.
           
           //extract c string from .Net String
           char *p = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();  
        
           cout<<p<<endl;  // use C++ to print to screen
        
           //free the extracted pointer.
           Marshal::FreeHGlobal(IntPtr(p));
        
        }  
        

        【讨论】:

          【解决方案5】:

          非常感谢您的回答。这是我在 C++ 中使用 libcurl 得到的解决方案。
          首先,您必须安装 libcurl(很棒的教程:https://stackoverflow.com/a/30290407)。
          然后,在安装 libcurl 之后,您必须以这种方式使用它(当然还要自定义它):

          #include <curl/curl.h>
          #include <string>
          int main(int argc, char **argv)
          {
              CURL *curl = NULL;
              curl_global_init(CURL_GLOBAL_ALL);
              curl = curl_easy_init();
              string message(R"({"Messages":[{"From":{"Email":"THE SENDER MAIL","Name":"Me"},"To":[{"Email":"THE RECEIVER EMAIL","Name":"TheName"}],"Subject":"TheSubject","TextPart":"TEST MAIL"}]})"); // "R" before the string is supposed to allow special characters like "\"
          
              curl_easy_setopt(curl, CURLOPT_URL, "https://api.mailjet.com/v3.1/send");
              //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
              curl_easy_setopt(curl, CURLOPT_USERNAME, "YOUR API USERNAME");
              curl_easy_setopt(curl, CURLOPT_PASSWORD, "YOUR API PASSWORD");
              curl_easy_setopt(curl, CURLOPT_HEADER, "Content-Type: application/json");
              curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, my_strlen(message)); // my_strlen is a personnal strlen, does the same as message.length()
              curl_easy_setopt(curl, CURLOPT_POSTFIELDS, message.c_str());
              curl_easy_perform(curl);
              curl_easy_cleanup(curl);
          }
          

          【讨论】:

            猜你喜欢
            • 2014-03-12
            • 2013-08-05
            • 1970-01-01
            • 1970-01-01
            • 2014-11-04
            • 2011-01-04
            • 1970-01-01
            • 2012-06-26
            • 2012-12-29
            相关资源
            最近更新 更多