Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向Visual Studio C+;创建的COM.dll添加新函数+;ATL项目_C#_C++_Com_Interop - Fatal编程技术网

C# 如何向Visual Studio C+;创建的COM.dll添加新函数+;ATL项目

C# 如何向Visual Studio C+;创建的COM.dll添加新函数+;ATL项目,c#,c++,com,interop,C#,C++,Com,Interop,我试图创建一个非常基本的COM DLL,用于包含在C++项目中,然后使用它将一些C++功能封装到COM模块中,以包含在C代码项目中(其余代码库使用的语言)。 我包括了COM dll,向COM dll添加了一个类,并在C#代码中对其进行了实例化,但到目前为止,我还无法向新类添加新功能 以下是我所做的: 新的Visual C#Windows窗体应用程序 右键单击解决方案->添加->新建项目 添加新VisualC++ + ATL项目(称为MyCOMDLL) 在ATL项目向导中选择的默认选项(我还尝试勾

我试图创建一个非常基本的COM DLL,用于包含在C++项目中,然后使用它将一些C++功能封装到COM模块中,以包含在C代码项目中(其余代码库使用的语言)。 我包括了COM dll,向COM dll添加了一个类,并在C#代码中对其进行了实例化,但到目前为止,我还无法向新类添加新功能

以下是我所做的:

  • 新的Visual C#Windows窗体应用程序
  • 右键单击解决方案->添加->新建项目 添加新VisualC++ + ATL项目(称为MyCOMDLL)
  • 在ATL项目向导中选择的默认选项(我还尝试勾选了“支持COM+1.0”)
  • 右键单击MyCMDL项目->添加->类
  • 添加新的VisualC++ + ATL COM+ 1组件< /LI>
  • 在短名称中键入“MyCOMObject”,这会自动填充“名称”选项卡中的其他字段
  • 将其他设置保留为默认设置
  • 构建MyCOMDLL项目
  • 在C#Windows窗体应用程序中添加对新MyCOMDLL.dll的引用
  • 右键单击C#Windows窗体应用程序项目->属性
  • 在“构建”选项卡上,将平台目标设置为x86
  • 将“使用myCMDLLIB;”添加到Form1.cs文件中
  • 在表单中添加一个按钮,然后在按钮功能中单击“添加”
  • 声明\u注册表\u资源ID(IDR\u MYCOMOBJECT)

    声明\u不可聚合(CMyCOMObject)

    开始COM映射(CMyCOMObject) COM_接口_条目(IMyCOMObject) COM_接口_条目(IDispatch) END_COM_MAP()

    //IMyCOMObject 公众: //SB:我尝试添加一种新方法 int ReturnTwo() { 返回2; } };

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


    非常感谢您的帮助。

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

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

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


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

    尝试从C#项目中删除引用,删除生成的Interop.mycmdllib.dll并重新添加引用。在构建并添加到C#项目之前,还尝试在.dll中添加函数和变量。这两种情况都没有乐趣。值得一试。您可能在COM注册方面遇到问题。您通常需要为COM注册dll,我认为只有在您也使用C构建dll的情况下,C才会自动注册。谢谢Sogger的建议。不幸的是,我很确定这不是注册问题。我之前确实遇到了一些与注册相关的问题。将C#项目设置为针对x86构建,并(之前未提及)以管理员身份运行VisualStudio,这就解决了这些问题。我认为如果不注册COM dll,我无法在运行时实例化该类。我想您可以通过以前注册的接口的旧版本实例化您的类,这可以解释您的问题。非常有效,谢谢!成功地使用向导添加了在C#app中可见的方法和属性,不过作为其他人的参考,在添加方法/属性时,您需要删除以前生成的interop DLL。
    MyCOMDLLLib.MyCOMObjectClass myVariable = new MyCOMObjectClass();
    
    // 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()
    {
    }