关于C++;DLL函数在C语言中的应用# 我有一个C++语言的DLL,然后用在C语言程序中。C#程序引用DLL,我调用这些类并可以使用DLL中定义的函数

关于C++;DLL函数在C语言中的应用# 我有一个C++语言的DLL,然后用在C语言程序中。C#程序引用DLL,我调用这些类并可以使用DLL中定义的函数,c#,dll,c++-cli,C#,Dll,C++ Cli,现在我想在DLL中添加其他函数,这样我就可以在C++中运行C++代码。我以DLL中其他函数的定义为例。h和.cpp以及我创建了一个执行代码的新函数。我把它放在与前面定义的函数相同的位置,但是当我把DLL放在我的C代码中时,我的函数不在那里。当我创建DLL类的实例时,我的函数不是它的一部分 我把它作为类的公共函数放在.h中,并给了它在.cpp中运行的代码,但找不到它 为什么我的C#程序不能看到我所做的函数,即使它与其他函数遵循相同的套件 更新 代码h: #pragma once #include

现在我想在DLL中添加其他函数,这样我就可以在C++中运行C++代码。我以DLL中其他函数的定义为例。h和.cpp以及我创建了一个执行代码的新函数。我把它放在与前面定义的函数相同的位置,但是当我把DLL放在我的C代码中时,我的函数不在那里。当我创建DLL类的实例时,我的函数不是它的一部分

我把它作为类的公共函数放在.h中,并给了它在.cpp中运行的代码,但找不到它

为什么我的C#程序不能看到我所做的函数,即使它与其他函数遵循相同的套件

更新

代码h:

#pragma once

#include <windows.h>
#include <PvDisplayWnd.h>
#include <vfw.h>
#include "NPvResult.h"
#include "NPvDeviceInfo.h"
#include "NPvBuffer.h"
#include <string>

using namespace System;
using namespace System::Runtime::InteropServices;

public ref class NPvDisplayWnd
{
public :
    NPvDisplayWnd();
    bool Handle();
    NPvResult^ ShowModeless(long locx, long locy, long x, long y);
    NPvResult^ ShowModal();
    NPvResult^ NPvDisplayWnd::Create();
    int^ Display( NPvBuffer^ aBuffer, int^ x);
    NPvResult^ Work( const std::string afilename, unsigned short asizex, unsigned short asizey, unsigned short aBPP, double aFPS);
    NPvResult^ Close();
    NPvResult^ DoEvents();
}

我添加的函数是Work()函数。如果我构建它并将其放在我的C#代码中,它会看到除work之外的所有函数。为了确保我使用的是正确的.dll,我将ShowModeless()的名称改为ShowModeless\uuuf(),然后重新生成并将其添加到我的C#中,并进行了更改,但我仍然没有看到我的Work()函数。

在Windows上,必须显式导出符号,以便用户能够通过dll访问它们。这是使用
\u declspec(导出)
语法完成的。这是编译和链接DLL时需要的



<>现在我们知道你使用的是C++ + CLI,而不是普通C++,我们可以看到一个问题。代码>工作采用
标准::字符串
。但是
Work
是一个托管函数,托管代码不能将
std::string
作为参数。您需要使用托管字符串类型。

< P>不能在C++中导入本机C++类。在现有的C++ DLL中,需要使用C++/CLI特性,以便托管客户端(如C++)能够导入类。p>
namespace XX
{ 
  public ref class YourClass{...};
}
它将导出
XX
命名空间下的托管类
YourClass
。您需要使用
/CLR
编译器标志


您可以将CPP文件集编译为托管文件,将其他文件集编译为非托管文件。托管类不能包含非托管内容(除非声明为指针)。

如果没有我添加的函数,DLL可以正常工作。我甚至在.h和.cpp中选择了一个函数将其重命名,并将其交给我的C#app,它看到了变化。该函数仅在.h和.cpp中引用。对于这个添加的函数,我遵循相同的设置,但它没有work@Grant:那么很有可能您没有加载您认为是的DLL。您需要确保在构建DLL后,它进入路径并覆盖旧路径,或者以其他方式覆盖它。如果这不是问题,那么你必须向我们展示你的代码。用于函数的C++(.h)和.cp代码(工作的和不使用的),以及用于加载它们的C代码。用代码更新。我只是引用了我的C代码,实例化了DLL类,你有链接到你正在工作的例子吗?这根本不是C++ DLL;这是C++ + CLI,它是一种不同于C++的语言(尽管类似)。
namespace XX
{ 
  public ref class YourClass{...};
}