2,求各给看客指正或帮我调试一下我的程序
先说结果,C#调用C++导出的组件出现如下异常。
而162行的错误,就是new位置的错误,
不知道是不是我导出的方式的问题,是下面几种(我也不确定是不是我导出方法不正确)。
回顾我做的主要步骤和问题求助
创建要导出DLL 的C++程序
我程序的过程导出声明过程步骤是,是先创建一个C++的DLL。
具体是在BOOL APIENTRY DllMain文件函数所在的cPP文件中,添加一个实现了一个导出封装业务逻辑的函数。函数名是Porter,函数的实现如下
其中int PowerFlowMain(char ** path )// 主要业务的逻辑。
添加一个def定义文件。 文件内容如下
LIBRARY "TestPowerFlow"
EXPORTS
Porter @1
创建调用DLL的C#程序。
C#的调用过程如下,找到C++生成的dll ,然后添加到引用。
定义如下委托函数,其中CppPorter是调用非托管代码的一个封转,这个城西中最重要的一部分是
这个委托封装与加载的定义如下! 1:
class CppPorter{[DllImport("kernel32.dll")] private extern static IntPtr LoadLibrary(String path); [DllImport("kernel32.dll")] //读取动态库文件 private extern static IntPtr GetProcAddress(IntPtr lib, String funcName); [DllImport("kernel32.dll")] private extern static bool FreeLibrary(IntPtr lib); private IntPtr hLib; public CppPorter(String DLLPath) { hLib = LoadLibrary(DLLPath); }public CppPorter(){}~CppPorter() { FreeLibrary(hLib); }//将要执行的函数转换为委托 public Delegate Invoke(String APIName, Type t){IntPtr api = GetProcAddress(hLib, APIName);return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);} [DllImport("TestPowerFlow.dll", EntryPoint = "Porter", ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern int Porter(ref string pp); //声明public void PowerFlowMainCSharp(){string path=@"d:\";Porter(ref path); //真实调用
}