如何将新函数添加到由Visual Studio C ++ ATL项目创建的COM .dll中

时间:2011-04-20 15:31:44

标签: c# c++ com interop

我正在尝试创建一个非常基本的COM dll以包含在C#项目中,然后用来将一些C ++功能包装到COM模块中以包含在C#项目中(其余代码使用的语言)碱)。

我包含了COM dll,在COM dll中添加了一个类并在C#代码中实例化了它,但到目前为止我还没有能够为新类添加新功能。

这就是我的所作所为:

  1. 新的Visual C#Windows窗体应用程序
  2. 右键单击解决方案 - >添加 - >新建项目...
  3. 添加新的Visual C ++ ATL项目(称为MyCOMDLL)
  4. 在ATL项目向导中选择的默认选项(我也尝试勾选'支持COM + 1.0')
  5. 右键单击MyCOMDLL project-> Add-> Class
  6. 添加新的Visual C ++ ATL COM + 1.0组件
  7. 将“MyCOMObject”键入短名称,自动填充“名称”标签中的其他字段
  8. 将其他设置保留为默认值
  9. 构建了MyCOMDLL项目
  10. 将新MyCOMDLL.dll的引用添加到C#Windows窗体应用程序
  11. 右键单击C#Windows窗体应用程序项目 - >属性
  12. 在“构建”选项卡上,将“平台目标”设置为x86
  13. 添加“使用MyCOMDLLLib;”到Form1.cs文件
  14. 向表单添加一个按钮,然后在按钮中单击添加功能
  15. MyCOMDLLLib.MyCOMObjectClass myVariable = new MyCOMObjectClass();

    我尝试了各种各样的东西,所以不会列出除了最明显的东西 - 我尝试在MyCOMObject.h中添加一个类方法:

    // CMyCOMObject
    class ATL_NO_VTABLE CMyCOMObject :
        public CComObjectRootEx,
        public CComCoClass,
        public IDispatchImpl
    {
    public:
        CMyCOMObject()
        {
        }

    DECLARE_PROTECT_FINAL_CONSTRUCT()
    
    HRESULT FinalConstruct()
    {
        return S_OK;
    }
    
    void FinalRelease()
    {
    }
    

    DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMOBJECT)

    DECLARE_NOT_AGGREGATABLE(CMyCOMObject)

    BEGIN_COM_MAP(CMyCOMObject) COM_INTERFACE_ENTRY(IMyCOMObject) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP()

    // IMyCOMObject public: // SB: My attempt at adding a new method int ReturnTwo() { return 2; } };

    ReturnTwo方法在CMyCOMObject的类视图中可见,但在C#Windows窗体应用程序项目的MyCOMObjectClass的类视图中不可见。

    任何帮助都非常感激。

2 个答案:

答案 0 :(得分:2)

  

我尝试将一个类方法添加到MyCOMObject.h

这还不够好。项目中的超级重要文件是.idl文件(接口描述语言)。该文件生成嵌入DLL中的类型库。类型库是.NET用于生成托管导入库的类型。您添加的功能将不在那里,因为您没有修改.idl文件。

如果手动修改界面很痛苦,有三个地方需要编辑。 .idl,.h和.cpp文件。最好使用向导完成。在“类视图”窗口中,右键单击界面(如IFoo),“添加”,“添加方法”(或“属性”)。然后切换到.cpp文件以编写方法的实现。

答案 1 :(得分:0)

您是否已将新的dll版本再次复制到C#项目中?