C++ 使用本机C++;
我刚开始从C#编写托管dll。我正在从msdn尝试这个。 该示例演示了如何通过本机C++调用简单方法。然而,我扩展了这个示例,并添加了一个名为CheckCar的简单方法。我的问题是如何在C中使用CheckCar方法++ 这是我的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 {
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也不支持字段。财产不是问题。