问:想用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怎么交互

环境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