C#生成com组件形式的dll供C++调用

①创建C#类库(ClassLibrary)、设置AssemblyInfo.cs中的[assembly: ComVisible(true)]默认是false、或者在接口和类之前添加设置为true
    [ComVisible(true)]
    [Guid("E709D3B9-18E8-4189-B1E0-49F72DD5A74C")]

    public interface CombineToolInterface{

       [DispId(1)]
       bool CalcuHeight(Object files, ref float fHeight)

利用VS工具中的创建GUID生成GUID

②定义接口其中每个接口对应一个[DispId(1)] id必须唯一。

③具体实现

    [ComVisible(true)]
    [Guid("C76A4C63-46DE-4D3A-8DD7-00E71B42D9AA")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("PDFCombine.CombineToolInterface")]

    public class CombineTool : CombineToolInterface{

      bool CalcuHeight(Object files, ref float fHeight){

              List arrFile = new List((string[])files);

              return true;}

④默认情况下会生成.tlh和.dll文件,然后使用VS类向导添加类选择 MFC Class From TypLib..如下图:C#生成com组件形式的dll供C++调用_第1张图片

有.h和dll文件VC就可以使用了。

注:若C#参数需要数组,则可以定义为Object,C++对应的是VARINT
eg. BOOL CalcuHeightWidth(VARIANT& files, float * fHeight) {
        BOOL result;
        static BYTE parms[] = VTS_VARIANT VTS_PR4 ;
       return result;
}

在COM中传递数组需要SAFEARRY,但是SAFEARRY需要使用VARIANT包装一下,如下:
    VARIANT arryVar;
    VariantInit( &arryVar );
    arryVar.vt = VT_ARRAY | VT_BSTR;
    SAFEARRAY* pSa = SafeArrayCreateVector(VT_BSTR, 0, vecTmpFiles.size());

    BSTR* bFile = new BSTR[vecTmpFiles.size()];
    for (int i = 0; i < vecTmpFiles.size(); ++i)
    {
        bFile[i] = SysAllocString(vecTmpFiles.at(i));
        SafeArrayPutElement(pSa,(long*)&i, bFile[i]);
    }

    SafeArrayAccessData(pSa, (void**)&bFile);
    arryVar.parray = pSa;
    SafeArrayUnaccessData(pSa);
    SafeArrayDestroy(pSa); //会自动释放BSTR* bFile数组,无需再释放bFile,否则重复释放。

你可能感兴趣的:(C#生成com组件形式的dll供C++调用)