我正在使用C ++ / CLI在CLR控制台应用程序中测试一个简单的DLL。 DLL只有一个我正在尝试使用的功能。我正在引用DLL并在项目属性页面中设置Resolve #using Reference,但是我看不到我编写的函数。我猜我可能错过了某处的访问修饰符,但我不确定。以下是我的代码细分:
DLL代码标头:
// LogDLL.h
#pragma once
#using <mscorlib.dll>
using namespace System;
namespace LogDLL {
public ref class LogFuncs
{
// TODO: Add your methods for this class here.
LogFuncs(){;};
~LogFuncs(){;};
void log_to_file ( System::String ^file, bool overwrite, System::String ^text );
};
}
DLL代码来源:
#include "stdafx.h"
#include "LogDLL.h"
using namespace System::Globalization;
void LogDLL::LogFuncs::log_to_file ( System::String ^file, bool overwrite, System::String ^text )
{
//Do Stuff
}
我正在使用的测试代码:
#include "stdafx.h"
#using <LogDLL.dll>
using namespace System;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
LogDLL::LogFuncs^ a;
a::LogDLL::LogFuncs:: //<-- Intellisense doesn't show the function from the DLL
return 0;
}
同样,我不确定我错过了什么。自从我使用C ++ / CLI以来已经有一段时间了,所以我很生气。
更新:
我继续按照彼得的建议将课程改为结构。
已修改的DLL标头代码:
// LogDLL.h
#pragma once
#using <mscorlib.dll>
using namespace System;
namespace LogDLL {
public ref struct LogFuncs
{
// TODO: Add your methods for this class here.
LogFuncs(){;};
~LogFuncs(){;};
void log_to_file ( System::String ^file, bool overwrite, System::String ^text );
};
}
我仍然不明白为什么即使我将它指定为公共类,该类仍将默认为私有。这是否存在一些根本原因?如果我使用非托管C ++会不会有任何不同?
答案 0 :(得分:2)
类的默认访问权限是私有的。要为要公开的成员添加“public:”,要么更改为具有默认访问权限的ref结构。
关于IntelliSense,我假设你正在使用Visual Studio 2005或Visual Studio 2008; Visual Studio 2010不支持用于C ++ / CLI代码的IntelliSense(这是因为解析器已被EDG取代,并且他们在2010版本中没有将C ++ / CLI解析功能改进其中)。
我怀疑IntelliSense会使用您正在使用的语法自动完成。你想要“a-&gt;”相反(当然,在运行此代码之前gcnew)。