C++ 使用本机C++;

C++ 使用本机C++;,c++,visual-studio-2010,dll,C++,Visual Studio 2010,Dll,我刚开始从C#编写托管dll。我正在从msdn尝试这个。 该示例演示了如何通过本机C++调用简单方法。然而,我扩展了这个示例,并添加了一个名为CheckCar的简单方法。我的问题是如何在C中使用CheckCar方法++ 这是我的C#代码 public class car { public string CarMake { get; set; } public int CarModel { get; set; } } public interface ICalculator {

我刚开始从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;
        }
    }
}
    // 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();

<强>这是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;
        }
    }
}
    // 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++中访问对象CARS及其属性?< /P>
更新:

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

这是我更新的C代码


您必须将
Car
作为COM对象公开(与
ManagedClass
ICalculator
的方式相同),然后实例化它并将其发送到
CheckCar
方法


有一个类似的例子可以作为指导(好吧,它比你需要的更复杂,只是服务器作为一个例子)。

谢谢你的回复。我目前在AssemblyInfo.CS中有我的所有信息(如上所述),我是否需要将这些信息移动到类声明的顶部,就像您发布的链接一样。我尝试在类car上执行
[ComVisible(true)]
,但它说它无法将其解析为类型。在COM公开的方法中,应该使用接口,而不是类。NET可以为类生成接口,但这最终会让人更加困惑。看到了吗?这是否意味着我们不能将对象传递给这些类?我的目标是使用来自C++的托管的DLL中的对象。接口不能包含字段。我在这里有点困惑您可以使用对象,但您应该将其建模为接口,就像您的
ManagedClass
对象通过
ICalculator
接口使用一样。默认情况下,.NET互操作层将为“COMVisible”类创建适当的接口,除非您使用属性对其进行自定义。您应该将
CarImpl
公开为
COMVisible
,并在
iCalComplator
接口中使用
ICar
,而不是
CarImpl
。与您为ManagedClass所做的方式完全相同。如果用同样的方法去做,就会陷入成功的陷阱,声明一个ICar接口。这怎么可能呢。我相信接口不能包含字段这是件好事,COM也不支持字段。财产不是问题。