使用Native C ++中的托管dll中的对象

时间:2013-03-13 16:56:55

标签: c++ visual-studio-2010 dll

我刚开始用C#编写一个托管dll。我是从msdn尝试这个example的。 该示例演示了如何通过本机C ++调用简单方法。然而,我扩展了示例并添加了一个名为CheckCar的简单方法。我的问题是如何在C ++中使用CheckCar方法

这是我的C#代码

public class car
{
    public string CarMake { get; set; }
    public int CarModel { get; set; }
}

public interface ICalculator
{
    int Add(int Number1, int Number2);
    int Multiply(int a, int b);
    car CheckCar(car c);
};

public class ManagedClass : ICalculator
{
    public int Add(int Number1, int Number2)
    {
        return Number1 + Number2;
    }

    public int Multiply(int a, int b)
    {
        return a * b;
    }
    public car CheckCar(car c)
    {
        if(c.CarMake.Equals("honda"))
        {
            car _c = new car();
            _c.CarMake = "Honda";
            _c.CarModel = 1232121;
            return _c;
        }
        else
        {
            return null;
        }
    }
}

这是C ++代码

    // Initialize COM.
    HRESULT hr = CoInitialize(NULL);

    // Create the interface pointer.
    ICalculatorPtr pICalc(__uuidof(ManagedClass));

    long lResult = 0;

    // Call the Add method.
    pICalc->Add(5, 10, &lResult);
    wprintf(L"The result is %d", lResult);

    // Uninitialize COM.
    CoUninitialize();

这就是我的AssemblyInfo的样子

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("sManagedDLL")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("sManagedDLL")]
[assembly: AssemblyCopyright("Copyright ©  2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
//[assembly: ComVisible(false)]
[assembly: ComVisible(true)] 
[assembly: AssemblyDelaySign(false)] 
[assembly: AssemblyKeyFile("..\\..\\..\\MyKeyFile.SNK")]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("41fc209d-a359-45d7-bf05-b1d93690824d")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

我的问题是如何在C ++中调用car CheckCar(car c);方法。我怎么能用C ++访问对象车及其属性?

更新

更新我的代码后,我无法访问我的C ++中的IcarPtr

这是我更新的C#代码

namespace sManagedDLL
{
   [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
    public interface Icar
    {
        string GetCarMake(); 
        void SetCarMake(string rx);

        int GetCarModel();
        void SetCarModel(int rx);
    }

    [ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA5")]
    public class CarImpl : Icar
    {
        private string carmake;
        private int carmodel;

        public string GetCarMake(){return carmake;}
        public void SetCarMake(string rx) { this.carmake = rx;}

        public int GetCarModel() {return carmodel ;}
        public void SetCarModel(int rx){this.carmodel = rx;}
    }

    public interface ICalculator
    {
        int Add(int Number1, int Number2);
        int Multiply(int a, int b);
        Icar CheckCar(CarImpl c);
    }

    public class ManagedClass : ICalculator
    {
        public int Add(int Number1, int Number2)
        {
            return Number1 + Number2;
        }

        public int Multiply(int a, int b)
        {
            return a * b;
        }

        public Icar CheckCar(CarImpl c)
        {
            if (c.GetCarModel().Equals("honda"))
            {
                CarImpl _c = new CarImpl();
                _c.SetCarMake("Honda");
                _c.SetCarModel(1212132);
                return _c;
            }
            else
            {
                return null;
            }
        }//end method
    }
}

1 个答案:

答案 0 :(得分:2)

您必须将Car公开为COM对象(与ManagedClassICalculator相同),然后实例化它并将其发送到CheckCar方法。< / p>

您可以使用类似的示例here作为指导(嗯,它比您需要的更复杂但服务器作为插图)。