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++ でオブジェクト car とそのプロパティにアクセスするにはどうすればよいですか?

アップデート:

コードを更新した後、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 オブジェクトとして公開し (およびCarの場合と同じ方法)、それをインスタンス化してメソッドに送信する必要があります。ManagedClassICalculatorCheckCar

ガイダンスとして使用できる同様の例がここにあります (まあ、これは必要なものよりも複雑ですが、例としてのサーバーです)。

于 2013-03-13T17:12:01.233 に答える