在.NET中使用C/C++LI实用程序:
我一直在开发一些DLL实用程序项目,以避免在其他项目中重复代码,以及我还没有尝试过的功能,算法和测试.其中一个项目是C/C++LI,我还在学习这种语言,所以这个问题可能听起来很愚蠢.由于我在C/C++LI,F#和C#中有Library Projects,我使用C#控制台应用程序来测试它们.它不能与C/C++LI项目一起使用,因此我创建了一个C/C++LI控制台测试项目.它从未起作用,当我更改原始DLL C的名称时,引用未更新.当我(最终)发现问题时,我更改了.vcxproj文件,使得using指令成为可能,就像一个方法一样,但不是模板类Apont< typename T>,这是某种内部指针,但是与.NET类型System :: IntPtr不同,使用类型T *而不是void *的值.
我还发现(从这个网站的帖子中)我必须在项目中使用我想要在外面使用的东西,否则那些东西想要在元数据中发出.所以我在静态实用程序中有一个无用的静态方法用于此目的: static void Funcionalidades() { int i = 10; Apont<int> a2 = Apont<int>(i); // stack Apont<int> ^a3 = gcnew Apont<int>(i); // heap CLR } 尽管如此,它不起作用.这是我在C/C++LI测试项目中的主要方法: int main(array<System::String ^> ^args) { int y(10); Apont<int> a = Apont<int>(y); Console::ReadKey(); return 0; } 以下是错误(我知道它可以用intellisense错误编译,但无论如何我都会显示它们): error C2065: 'Apont' : undeclared identifier error C2062: type 'int' unexpected IntelliSense: identifier "Apont" is undefined IntelliSense: type name is not allowed IntelliSense: expected an expression 为什么这些错误在这里?我怎样才能纠正它们? 我很感激任何答复或回复. 编辑(澄清): >这些错误不会出现在Funcionalidades方法中,即在DLL项目中,而是在主方法上,即在DLL之外的测试项目中. > Apont是一个模板(因为T *在内部使用,并且“不允许在通用类型的参数上进行间接”). NTH EDIT(其中’n’是我不知道的数字): Apont的代码你一直在抱怨这么久: template<typename T> public ref class Apont sealed : public IDisposable { bool eliminado; T *pointer; /*void Dispose(bool tudo) { if (!eliminado) { if (tudo) { ~Apont(); } else { !Apont(); } } }*/ !Apont() // finalizador: limpa os recursos "unmanaged" { delete pointer; pointer = nullptr; eliminado = true; } public: Apont(T &valor) { pointer = &valor; eliminado = false; ErroSeNulo = false; ErroSeEliminado = true; } Apont(T &valor,bool erroSeEliminado,bool erroSeNulo) { pointer = &valor; eliminado = false; ErroSeEliminado = erroSeEliminado; ErroSeNulo = erroSeNulo; } Apont(Apont<T> %outroApont) { this->pointer = &outroApont } property bool ErroSeEliminado; property bool ErroSeNulo; property T Valor { T get() { if (pointer != nullptr) return *pointer; else if (eliminado && ErroSeEliminado) throw gcnew ObjectDisposedException("O objeto já foi pelo menos parcialmente eliminadao."); else if (ErroSeNulo) throw gcnew NullReferenceException(); else return 0; } } /* Apont operator ~(/*T valor* /) { // este operador tem de ser declarado fora desta classe }*/ T operator !(/*Apont apont*/) { return Valor; } void operator =(Apont<T> outroApont) { pointer = outroApont; ErroSeEliminado = outroApont.ErroSeEliminado; ErroSeNulo = outroApont.ErroSeNulo; } template<typename U> void operator =(Apont<U> outroApont) { pointer = safe_cast<T>(outroApont.pointer); ErroSeEliminado = safe_cast<T>(outroApont.ErroSeEliminado); ErroSeNulo = safe_cast<T>(outroApont.ErroSeNulo); } /* void operator =(T *&outroPointer) { pointer = outroPointer; } template<typename U> void operator =(U *&outroPointer) { pointer = safe_cast<T>(outroPointer); }*/ void operator =(T *outroPointer) { pointer = outroPointer; } template<typename U> void operator =(U *outroPointer) { pointer = safe_cast<T>(outroPointer); } ~Apont() // destruidor: limpa todos os recursos { this->!Apont(); } // Error C2605: 'Dispose': this method is reserved within a managed class // O código será gerado automaticamente a partir do finalizador e do destrutor }; template<typename T> Apont<T> operator ~(T &valor) { return gcnew Apont<T>(valor); } 解决方法
出现的错误通常是缺少类的声明.这通常会发生,然后标题中的代码被标题保护.
这是怎么回事? 如果你在Funcionalidades中包含Apont标题然后在Apont中包含Funcionalidades标题而不是你遇到麻烦.发生这种情况是因为Funcionalidades标题缺少Apont的声明,以防你在包括Funcionalidades之前在你的主要包括Apont. 然后你第一次包括Apont,它将启用头部防守.然后它将包括Funcionalidades,其中包括Apont.因为标头防护已经启用,Funcionalidades标头将不会有Apont声明.与此同时Apont声明甚至还没有在Apont的相应头文件中开始.而你在这里,因为这个问题在main中无法编译,因为在库编译时你没有这样的依赖. 我如何解决它? 在Cpp代码中移动Fponionalidades实现中的Apont的使用,保持头文件没有依赖性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |