Jas*_*Cav 14 .net c# command-line-interface
我试图从我的C#应用程序(通过C++/CLI)调用我的C++库.我按照这个问题的例子(针对我的具体应用).我的应用程序的设置是:
不幸的是,当我真正去访问我的C#应用程序中的CLR包装器对象时,我收到以下错误:
找不到类型或命名空间名称'YourClass'(您是否缺少using指令或程序集引用?)
我是否错误地设置了项目,或者还有其他我应该研究的内容?(不幸的是,我不能出于专有原因发布代码,但这是一个非常简单的代码,很容易遵循上面的例子.)
更新:
所以我完全按照Chris所说的去做(见下面的答案),但我仍然收到来自我的C#应用程序的消息"找不到类型或命名空间名称'MyProgram'(你是否缺少using指令或程序集)参考?).这是我的代码的(模拟).
MyWrapper.h
#pragma once
#include "myorigapp.h"
using namespace System;
namespace MyProgram
{
public ref class MyWrapper
{
private:
myorigapp* NativePtr;
public:
MyWrapper()
{
NativePtr = new myorigapp();
}
~MyWrapper()
{
delete NativePtr;
NativePtr = NULL;
}
void dostuff()
{
NativePtr->dostuff();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Program.cs中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyProgram;
namespace Testing
{
class Program
{
static void Main(string[] args)
{
MyWrapper p = new MyWrapper();
p.dostuff();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Project3引用引用Project1的Project2.所有内容都构建没有错误(除了我在上面的C#代码中描述的错误using MyProgram).
仅仅包含纯C++应用程序的头文件就不够好了.您需要在Project2中使用托管对象包装非托管对象(即public ref class YourClassDotNet)
#include "YourHeader.h"
namespace MyManagedWrapper
{
public ref class YourClassDotNet
{
private:
YourClass* ptr;
public:
YourClassDotNet()
{
ptr = new YourClass();
}
~YourClassDotNet()
{
this->!YourClassDotNet();
}
!YourClassDotNet()
{
delete ptr;
ptr = NULL;
}
void SomeMethod()
{
ptr->SomeMethod();
}
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,好吧,我现在感觉很愚蠢。
事实证明,我遇到的问题(我几周前解决了 - 只是更新这个答案)是我包含了头文件(请参阅 Chris 的答案),但我实际上没有包含CPP 文件(除了包含头文件之外是空的)。
完成此操作后,DLL 就会正确编译,并且我可以从 C# 代码调用 C++ 函数(使用 C++/CLI)。