我已成功让Dreamweaver接受我的DLL并调用它的方法.DLL是用C++编写的,带有C嵌入式函数(因此函数名称不会被破坏.)
我想对C++指针和数据类型感到满意,但我对C#的熟练程度要高得多,所以对于我们的时间表,我认为研究直接C解决方案的替代方案是值得的.
理论上我是否能够在C#中构建一个可以从"外部"看到的与C DLL相同的DLL?
并作为替代
我能用工作的C DLL"包装"一个C#DLL吗?
我担心的主要部分是函数的数据类型,因为当dreamweaver调用它们时,它期望void和char指针作为来回传递数据的格式.
谢谢.
是的,C++/CLI编译器使这很容易.它会自动生成一个"thunk",确保在非托管程序调用导出函数时加载CLR.最好用一个例子来证明.
从C#代码开始,从类库项目模板创建一个新项目.你必须编写一个静态方法,因为C代码对类没有任何了解.这是一个简单的例子:
using System;
namespace ClassLibrary1 {
public static class Mumble {
public static int method(int arg) { return arg; }
}
}
Run Code Online (Sandbox Code Playgroud)
在解决方案资源管理器窗口的Add + New Project中右键单击解决方案名称.选择Visual C++,CLR,类库.右键单击新项目,"属性","公共属性","框架和引用",然后单击"添加新引用"."项目"选项卡,选择您的C#项目.
打开.cpp文件并编写如下代码:
#include "stdafx.h"
using namespace ClassLibrary1;
extern "C" __declspec(dllexport)
int method(int arg) {
return Mumble::method(arg);
}
Run Code Online (Sandbox Code Playgroud)
建立.这个DLL现在可以被你的非托管代码使用,它可以调用"方法"函数.这个DLL和你的C#DLL都需要复制到非托管程序的目录中.
请注意调用此方法会产生开销.C++/CLI编译器生成的thunk做了大量工作以确保加载和初始化CLR.调试将无法使用(使用Debugger.Break()),未捕获的托管异常将使您的程序崩溃,诊断非常糟糕.