0

我刚开始从 C# 编写托管 dll。我正在从 msdn尝试这个示例。该示例演示了我们如何通过本机 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")]

我的问题是如何car CheckCar(car c);在 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
    }
}
4

1 回答 1

2

您必须公开为 COM 对象(与对andCar所做的方式相同),然后实例化它并将其发送到方法。ManagedClassICalculatorCheckCar

这里有一个类似的示例,您可以将其用作指导(嗯,它比您需要的更复杂,但服务器作为说明)。

于 2013-03-13T17:12:01.233 回答