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