我刚开始用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
}
}
答案 0 :(得分:2)
您必须将Car
公开为COM对象(与ManagedClass
和ICalculator
相同),然后实例化它并将其发送到CheckCar
方法。< / p>
您可以使用类似的示例here作为指导(嗯,它比您需要的更复杂但服务器作为插图)。