我想使用一些执行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;
}
谢谢
答案 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。