问:想用CodeBlocks的C++程序(终极生产DLL)调用VS生成的dll
问:想用CodeBlocks的C++程序(最终生产DLL)调用VS生成的dll
这个问题困扰我很久了,为了保护自己的作品不被他人反编译我一直想用C++,结果由于跨平台、跨语言的开发很少见,所以一直没有找到解决方法,先描述一下基本情况:
我是做Unity3D开发的,这个软件的脚本是用JS、Boo和C#写,我选择的是C#。Unity3D提供一个UnityEngine.dll的API,这个API是用CSharp写的,编译可能是使用MonoDevelop,个人觉得也有可能是使用VS编译的,但是Unity3D编辑器的开发平台是架构在Mono之上的,因此觉得使用VS的编译UnityEngine.dll的可能性不大。由于采用CSharp,所以用Unity3D编译的应用很容易被反编译,所以想用C++写成DLL供Unity3D的脚本使用。
简化描述就是:用C++调用CSharp生成的DLL类库生成DLL再供CSharp程序使用。
现在我已经实现的有:
1、在VS和CodeBlocks中不调用此DLL中的方法和类,编译的DLL可以在Unity3D中正常使用;
2、在CodeBlocks中无法引用此DLL,因此也无法使用namespace调用此DLL中的类和方法;在VS中通过引用和namespace可以调用此DLL中的方法和类,但是编译的DLL无法在Unity3D中调用,Unity3D会直接退出,并且不会报任何错误,即Crash。
3、有个老外说用VS写Unity3D的C++插件必须将项目设置为安全,我下载了一个VS2008试用版的,结果在通用属性里找到相近的项目为“公共语言运行库支持”,后面选项中只有一个“安全MSIL公共语言运行库支持(/clr:safe)”与其描述相近;但是这样设置后编译通不过,因为我需要使用“_declspec(dllexport)”来定义方法或者类,否则在Unity3D的CSharp脚本中使用[DllImport]调用。
4、由于只能我曾经用MonoDevelop编译C#写的脚本为DLL插件在Uity3D中调用成功,当时是使用namespace方式,因此我在VS中也想利用此方法,结果编译的DLL在CSharp中using时报找不到相应的namespace。
现在我想问我想法能实现不?即:用C++调用CSharp生成的DLL类库生成DLL再供CSharp程序使用;无论是使用[DllImport]或者namespace(我更喜欢后者)。
另外,我衷情于开源,所以希望在CodeBlocks中实现,不过即使在VS实现也不要紧,我想免费3个月的时间我应该可以将相应的应用转到CodeBlocks平台上。
无论有没有解决方法,在于先谢谢各位参与者。
------解决思路----------------------
CodeBlocks和VC对C++的符号命名规则是否一样?
建议导出的函数用C风格。C++对函数符号的命名没做规定
------解决思路----------------------
楼主啊,就一句话:珍惜生命,远离扩展dll,只属于纯C接口的标准dll。
别折腾了。
------解决思路----------------------
涉及到跨平台的交互了,gcc下的a库和vs下的dll怎么交互
这个问题困扰我很久了,为了保护自己的作品不被他人反编译我一直想用C++,结果由于跨平台、跨语言的开发很少见,所以一直没有找到解决方法,先描述一下基本情况:
我是做Unity3D开发的,这个软件的脚本是用JS、Boo和C#写,我选择的是C#。Unity3D提供一个UnityEngine.dll的API,这个API是用CSharp写的,编译可能是使用MonoDevelop,个人觉得也有可能是使用VS编译的,但是Unity3D编辑器的开发平台是架构在Mono之上的,因此觉得使用VS的编译UnityEngine.dll的可能性不大。由于采用CSharp,所以用Unity3D编译的应用很容易被反编译,所以想用C++写成DLL供Unity3D的脚本使用。
简化描述就是:用C++调用CSharp生成的DLL类库生成DLL再供CSharp程序使用。
现在我已经实现的有:
1、在VS和CodeBlocks中不调用此DLL中的方法和类,编译的DLL可以在Unity3D中正常使用;
2、在CodeBlocks中无法引用此DLL,因此也无法使用namespace调用此DLL中的类和方法;在VS中通过引用和namespace可以调用此DLL中的方法和类,但是编译的DLL无法在Unity3D中调用,Unity3D会直接退出,并且不会报任何错误,即Crash。
3、有个老外说用VS写Unity3D的C++插件必须将项目设置为安全,我下载了一个VS2008试用版的,结果在通用属性里找到相近的项目为“公共语言运行库支持”,后面选项中只有一个“安全MSIL公共语言运行库支持(/clr:safe)”与其描述相近;但是这样设置后编译通不过,因为我需要使用“_declspec(dllexport)”来定义方法或者类,否则在Unity3D的CSharp脚本中使用[DllImport]调用。
4、由于只能我曾经用MonoDevelop编译C#写的脚本为DLL插件在Uity3D中调用成功,当时是使用namespace方式,因此我在VS中也想利用此方法,结果编译的DLL在CSharp中using时报找不到相应的namespace。
现在我想问我想法能实现不?即:用C++调用CSharp生成的DLL类库生成DLL再供CSharp程序使用;无论是使用[DllImport]或者namespace(我更喜欢后者)。
另外,我衷情于开源,所以希望在CodeBlocks中实现,不过即使在VS实现也不要紧,我想免费3个月的时间我应该可以将相应的应用转到CodeBlocks平台上。
无论有没有解决方法,在于先谢谢各位参与者。
------解决思路----------------------
CodeBlocks和VC对C++的符号命名规则是否一样?
建议导出的函数用C风格。C++对函数符号的命名没做规定
------解决思路----------------------
楼主啊,就一句话:珍惜生命,远离扩展dll,只属于纯C接口的标准dll。
别折腾了。
------解决思路----------------------
涉及到跨平台的交互了,gcc下的a库和vs下的dll怎么交互
环境winxp, mingw vs2008
1. dll.h
#ifndef LIB_H
#define LIB_H
#ifdef LIBAPI
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
extern "C"
{
int EXPORT add(int x, int y);
}
#endif
2. testDll.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include <stdio.h>
#define LIBAPI
#include "dll.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("\nprocess attach of dll");
break;
case DLL_THREAD_ATTACH:
printf("\nthread attach of dll");
break;
case DLL_THREAD_DETACH:
printf("\nthread detach of dll");
break;
case DLL_PROCESS_DETACH:
printf("\nprocess detach of dll");
break;
}
return TRUE;
}
int EXPORT add(int x, int y)
{
return x + y;
}
3. 用VC++生成testDll.dll, testDll.lib,并将它们与dll.h copy到gcc工作目录下
4。Test.cpp
#include <iostream>
#include <dll.h>
using namespace std;
int main (int argc, char *argv[])
{
cout << "hello world" << endl;
int count = add(10, 20);
return(0);
}
5. 编译:
g++ Test.cpp testDll.lib -o Test -I.
6。 执行:
./Test.exe