需要C#/ C ++ DLL建议

时间:2010-07-22 15:41:09

标签: .net c dll

我已成功让Dreamweaver接受我的DLL并调用它的方法。 DLL是用C ++编写的,具有C互操作函数(因此函数名称不会被破坏。)

我想对C ++指针和数据类型感到满意,但我对C#的熟练程度要高得多,所以对于我们的时间表,我认为研究直接C解决方案的替代方案是值得的。

理论上我是否能够在C#中构建一个可以从“外部”看到的与C DLL相同的DLL?

并作为替代

我是否可以使用正常工作的C DLL“包装”C#DLL?

我担心的主要部分是函数的数据类型,因为当dreamweaver调用它们时,它会期望void和char指针作为来回传递数据的格式。

谢谢。

3 个答案:

答案 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函数。