在C ++本机代码中使用C ++ / CLI库以及如何链接

时间:2015-03-13 14:14:10

标签: c++ dll c++-cli

我想使用一些执行http-post的代码,因为我不太熟悉c ++以及你可以使用哪些库,而且我可能太愚蠢了,无法使libcurl和curlpp工作,我找到了解释如何使用.net版本的链接。

好吧,所以我创建了一个课程。头文件:

public ref class Element
{
public:
    Element();
    virtual ~Element();
    void ExecuteCommand();
};

班级档案:

#include "Element.h"


Element::Element()
{
}


Element::~Element()
{
    Console::WriteLine("deletion");
}


void Element::ExecuteCommand(){
    HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(WebRequest::Create("http://www.google.com"));

    request->MaximumAutomaticRedirections = 4;
    request->MaximumResponseHeadersLength = 4;

    request->Credentials = gcnew NetworkCredential("username", "password", "domain");
    HttpWebResponse^ response = dynamic_cast<HttpWebResponse^>(request->GetResponse());
    Console::WriteLine("Content length is {0}", response->ContentLength);
    Console::WriteLine("Content type is {0}", response->ContentType);

    // Get the stream associated with the response.
    Stream^ receiveStream = response->GetResponseStream();

    // Pipes the stream to a higher level stream reader with the required encoding format. 
    StreamReader^ readStream = gcnew StreamReader(receiveStream, Encoding::UTF8);
    Console::WriteLine("Response stream received.");
    Console::WriteLine(readStream->ReadToEnd());
    response->Close();
    readStream->Close();

}

如果我将此项目的配置类型设置为Application(exe),并创建一个新的.cpp文件,我在其中创建此Element的实例,它可以正常工作。

但我的问题是:是否可以从这个项目创建一个.dll / .lib库并在没有CLI的C ++项目中使用它? (我不想使用^作为指针:()

即使不可能,我还有另外一个问题。 当我在C ++ / CLI项目中链接库时。我得到了

unresolved token (06000001) Element::.ctor
unresolved token (06000002) Element::~Element
unresolved token (06000003) Element::ExecuteCommand
3 unresolved externals

第二个项目中main.cpp的代码如下:

#include <Element.h>

int main(){
    return 0;
}

谢谢

1 个答案:

答案 0 :(得分:2)

正如Hans Passant已经说过的那样:必须将C ++ / CLI代码编译为动态库,以便能够从非托管应用程序中使用它。 CLI /托管代码无法从/不能驻留在静态库中。 如果将C ++ / CLI库目标从静态库更改为动态库,则可以成功编译非托管C ++应用程序。

我的一个想法: 如果您使用混合模式C ++ / CLI DLL来使用托管功能,我认为您会更好 - 您将能够完全免除您的消费者应用程序引用CLR。

Element类的这种混合模式Wrapper的标题如下所示:

#pragma once

#pragma unmanaged

#if defined(LIB_EXPORT)
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif

class ElementWrapperPrivate;

class __declspec(dllexport) ElementWrapper
{
private:
    ElementWrapperPrivate* helper;

public:
    ElementWrapper();
    ~ElementWrapper();
public:
    void ExecuteCommand();
};

实现看起来像这样:

#include "ElementWrapper.h"
#pragma managed

#include "Element.h"
#include <msclr\auto_gcroot.h>

using namespace System::Runtime::InteropServices;

class ElementWrapperPrivate
{
public:
    msclr::auto_gcroot<Element^> elementInst;  // For Managed-to-Unmanaged marshalling
};

ElementWrapper::ElementWrapper()
{
    helper = new ElementWrapperPrivate();
    helper->elementInst = gcnew Element();
}

ElementWrapper::~ElementWrapper()
{
    delete helper;
}

void ElementWrapper::ExecuteCommand()
{
    helper->elementInst->ExecuteCommand();
}

然后只需将Element.cpp + ElementWrapper.cpp编译为DLL,并在非托管应用程序中使用ElementWrapper.h。