【问题标题】:Native c++ instance in managed code using C++ wrapper使用 C++ 包装器的托管代码中的本机 C++ 实例
【发布时间】:2010-11-24 18:39:49
【问题描述】:

我们面临互操作问题,我们正在用 C# 编写客户端 exe,我们有一些用 COM dll 编写的遗留代码和一个原生 C++ 静态库。 我们需要同时使用它们来完成 C# 客户端中的功能。我们使用互操作添加了对 COM dll 的引用,并且能够 在 C# 代码中创建 COM 类的实例。现在这个 COM 类方法接受的参数是 nactive C++ 的对象,COM 中的一些方法 类需要参数,这些参数是在 c++ 静态库中声明的类的对象。由于我们将无法创建 C++ 本地类的实例 C#,我们决定在原生类上编写 C++/CLI 包装器,并在 C# 代码中创建 warpper 的实例,并通过以下方式访问原生类的实例 warpper 并将其传递给在 C# 客户端中创建的 COM 类。问题是当我们将本地对象指针(作为 IntPtr)传递给 COM 类时,我们没有将本地对象初始化为其值。可能是什么问题呢?我们如何通过托管 c++ 包装器将原生对象传递回 C# 代码?

 //Natvie C++ class
 class __declspec(dllexport) CConfiguration
 {

    public :
         CConfiguration(void);
         virtual ~CConfiguration(void);
         void SetIPAddress(const char *IPAddress);
         void SetPort(const char*Port);
         void GetIPAddress(char *IPAddress);
         void GetPort(char *Port);
    Private:
         std::string IPAddress;
         std::string Port;

 }


//Managed C++ Class  
public ref class ManagedConfigruation
{
         public :
        ManagedConfigruation(){}
        ~ManagedConfigruation(){}
         CConfiguration  *myConfiguration;          
              IntPtr  GetObjectOfConfigurationPtr();     
}

IntPtr ManagedConfigruation::GetObjectOfConfigurationPtr()
{
     myConfiguration = new CConfiguration();
     myConfiguration.SetIPAddress("127.0.0.1");
     myConfiguration.SetPort("6200");
     //Convert native object to IntPtr and return to C# class
     return System::IntPtr(myConfiguration);
};

 //C# class on client exe
 public class CSharpClass
{

    //Wrapper of Managed C++ class
    ManagedConfiguration objManagedConfiguration = new ManagedConfiguration();
    IntPtr objPtr = objManagedConfiguration.GetObjectOfConfigurationPtr();

    //Belwoo COMObject needs object of type CConfiguration native C++ class    
    COMObject.Initialize(objPtr);  //Here is the problem object does not contain anything


}

【问题讨论】:

  • 不应该是COMObject.Initialize(objPtr)吗?
  • 谢谢保罗纠正它

标签: c# c++-cli native


【解决方案1】:

采用这样的原始指针的 COM 方法与自动化不兼容。很不寻常的是,COM 方法在这种情况下采用 COM 接口指针。您最好使用对象浏览器检查类型库转换后的样子。当参数类型为 object 时,您遇到了问题。

最好将 COM 接口代码也保留在 C++/CLI 中。

【讨论】:

    【解决方案2】:

    我从未使用过 COMObject.Initialize(x),不确定它的作用。

    但是,如果您想从 IntPtr 中取出 IUnknown,您可以这样做:

    object pUnk = Marshal.GetObjectForIUnknown(objPtr);
    

    另请参阅:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getobjectforiunknown.aspx

    【讨论】:

      【解决方案3】:

      Initialize 不是 COM 方法,它是我们自己的方法,它以 IntPtr 作为参数,它实际上是一个原生 C++ 对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-04
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多