我编写了一些软件来自动化一些第三方软件,并发现有必要研究如何调用该软件自己的dll。
注意事项:不幸的是,我不允许访问源代码或开发人员
使用PInvoke调用dll的静态方法很容易,但据我所知,如果没有C++/CLI包装器,实例化类是不可能的。
答案似乎是在dll周围创建一个C++/CLR包装器,如this answer所示。虽然这显然是一个很好的答案,但我以前从未创建过C++应用程序,也不知道该做什么。
我已经使用了dependency来获取我想要使用的函数名:sdk_string::sdk_string(const char *)
(作为修饰:??0sdk_string@@QAE@XZ
)。试着在那个起点上做PInvoke,却以悲伤和自怜告终。
从我收集的资料来看,我需要:
sdk_string* CreateSdkString(const char * chars) { return new sdk_string(chars); }
的内容new sdk_string(chars)
调用到第三方dll中?CreateSdkString
函数了吗?)我认为上面的第三步是我的问题:如何让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(无效)
发布于 2015-04-21 22:52:24
我想我错过了一些显而易见的谜题.如何将第三方.dll中的函数/类放入新的C++/CLR包装器,以便调用它
使用非托管库提供的头文件和导入库,就像将任何DLL导入非托管项目一样。将头文件包括在引用库的任何源文件中,并将导入库传递给链接器。
但是,在DLL中实现的基于C++类的发布接口是令人惊讶的。它对编译器的选择设置了严格的限制。我怀疑您正在反向工程一个私有库,因此不会有头文件或导入库。逆向工程很可能是一个无法追踪的问题。我建议与该库的开发人员联系以获得支持。
发布于 2015-04-21 23:00:35
显然,您只需要一些方法/函数,因此在这种情况下,最好的方法就是创建头文件(选项2)。如果您需要更多的类/方法,可以检查http://www.swig.org/,它可以创建到C#的包装器,但是它需要定义,例如,您可以创建一个头文件,让它命名为myHeader.h,如下所示:
class A
{
public:
int intMethod(float param);
}
在创建一个文件之后,让我们将其命名为myHeader.i,内容如下:
%module myHeader_wrapper
%{
//Here could be the header file or directly the class/functions definition
#include "myHeader.h"
%}
%include "myHeader.h"
在那之后你就跑:
swig -csharp myHeader.i
应该创建一个名为myHeader_wrap.c和myHeader.cs的文件。使用.c文件创建C++ dll,并使用C#项目中的.cs文件访问类。当然,可以使用IDE工具(例如,使visual运行post生成操作)来实现自动切换。
https://stackoverflow.com/questions/29784426
复制相似问题