首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从C++调用C#的dll方法/类

从C++调用C#的dll方法/类
EN

Stack Overflow用户
提问于 2015-04-21 22:38:35
回答 2查看 893关注 0票数 0

我编写了一些软件来自动化一些第三方软件,并发现有必要研究如何调用该软件自己的dll。

注意事项:不幸的是,我不允许访问源代码或开发人员

使用PInvoke调用dll的静态方法很容易,但据我所知,如果没有C++/CLI包装器,实例化类是不可能的。

答案似乎是在dll周围创建一个C++/CLR包装器,如this answer所示。虽然这显然是一个很好的答案,但我以前从未创建过C++应用程序,也不知道该做什么。

我已经使用了dependency来获取我想要使用的函数名:sdk_string::sdk_string(const char *) (作为修饰:??0sdk_string@@QAE@XZ)。试着在那个起点上做PInvoke,却以悲伤和自怜告终。

从我收集的资料来看,我需要:

  1. 创建一个新的VisualC++ CLR类库。
  2. 在主.h头文件中编写类似于:sdk_string* CreateSdkString(const char * chars) { return new sdk_string(chars); }的内容
  3. 以某种方式让new sdk_string(chars)调用到第三方dll中?
  4. ?(我需要以任何特殊的方式构建它吗?这样我就可以轻松地PInvoke我的CreateSdkString函数了吗?)
  5. 投票并接受你的答案。:-)

我认为上面的第三步是我的问题:如何让new sdk_string(chars) 调用调用第三方dll?,但是如果我在其他事情上错了,那么我错了的其他事情就是我的问题。

更新:

仅供参考,下面是这个类的整个Dependency函数名输出:

康斯特sdk_string::`vftable‘

类sdk_string &sdk_string::append( sdk_string const &)

类sdk_string & sdk_string::append(char)

类sdk_string & sdk_string::append(char *)

类sdk_string & sdk_string::append(char const *)

查尔康斯特*sdk_string::c_str(无效)

bool sdk_string::contains(char const *)

bool sdk_string::empty(无效)

bool sdk_string::endsWith(char const *)

int sdk_string::equals(类sdk_string const &)

int sdk_string::equals(char const *)

int sdk_string::equalsIgnoreCase(类sdk_string const &)

int sdk_string::equalsIgnoreCase(char const *)

void sdk_string::erase(int,int)

bool sdk_string::hasAlphaChars(无效)

int sdk_string::indexOf(类sdk_string const &)

int sdk_string::indexOf(char)

int sdk_string::indexOf(char,int)

int sdk_string::indexOf(char const *)

void sdk_string::insert(int,char const *)

bool sdk_string::isAllDigits(无效)

bool sdk_string::isAllWhiteSpace(无效)

int sdk_string::length(无效)

类sdk_string &sdk_string::operator=( sdk_string const &)

类sdk_string & sdk_string::operator=(char *)

void sdk_string::replace(int,int,class sdk_string const &)

void sdk_string::replace(char const *)

sdk_string::sdk_string(wchar_t * &)

Sdk_string::sdk_string(类sdk_string const &)

sdk_string::sdk_string(char const *)

Sdk_string::sdk_string(无效)

void sdk_string::setData(char const *)

bool sdk_string::startsWith(char const *)

bool sdk_string::stretch(int)

void sdk_string::stripLeadingSpaces(void)

void sdk_string::stripSpaces(void)

void sdk_string::stripTrailingSpaces(void)

void sdk_string::substr(int,int,class sdk_string &)

void sdk_string::toUpper(类sdk_string &)

Sdk_string::~sdk_string(无效)

EN

回答 2

Stack Overflow用户

发布于 2015-04-21 22:52:24

我想我错过了一些显而易见的谜题.如何将第三方.dll中的函数/类放入新的C++/CLR包装器,以便调用它

使用非托管库提供的头文件和导入库,就像将任何DLL导入非托管项目一样。将头文件包括在引用库的任何源文件中,并将导入库传递给链接器。

但是,在DLL中实现的基于C++类的发布接口是令人惊讶的。它对编译器的选择设置了严格的限制。我怀疑您正在反向工程一个私有库,因此不会有头文件或导入库。逆向工程很可能是一个无法追踪的问题。我建议与该库的开发人员联系以获得支持。

票数 1
EN

Stack Overflow用户

发布于 2015-04-21 23:00:35

显然,您只需要一些方法/函数,因此在这种情况下,最好的方法就是创建头文件(选项2)。如果您需要更多的类/方法,可以检查http://www.swig.org/,它可以创建到C#的包装器,但是它需要定义,例如,您可以创建一个头文件,让它命名为myHeader.h,如下所示:

代码语言:javascript
运行
复制
class A
{
public:
int intMethod(float param);
}

在创建一个文件之后,让我们将其命名为myHeader.i,内容如下:

代码语言:javascript
运行
复制
%module myHeader_wrapper
%{
//Here could be the header file or directly the class/functions definition
    #include "myHeader.h"
%}
%include "myHeader.h"

在那之后你就跑:

代码语言:javascript
运行
复制
swig -csharp myHeader.i

应该创建一个名为myHeader_wrap.c和myHeader.cs的文件。使用.c文件创建C++ dll,并使用C#项目中的.cs文件访问类。当然,可以使用IDE工具(例如,使visual运行post生成操作)来实现自动切换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29784426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档