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
}
}