以下是该方案:
我有WSCF Blue生成的C#Web服务客户端,我必须从C调用。我使用C ++ CLI“bridge”。在C#Web服务客户端我有
namespace MyCompany.Product.ExternalPlan.Client
{
public enum TMsgStatus
{
S_OK,
//...
E_ERROR,
}
这很好。
C ++ CLI项目执行类似这样的操作(这不在任何命名空间中!!):
try
{
EPClient::Client^ client = gcnew EPClient::Client();
m_ResponseHeader = client->CreateExternalProject(n_Project->Id, m_ProjectData, m_NameValuePairs, // in
m_PlanAndWorksExternal, ConvertNativeToManaged(n_UserName), // in
m_ProjectRet, m_PlanAndWorksRet); // out
}
catch (Exception ^ e)
{
// ...
return -1;
}
if (m_ResponseHeader->Status == MyCompany::Product::ExternalPlan::Client::TMsgStatus::S_OK)
{
ConvertManagedToNative(n_ProjectRet, m_ProjectRet);
}
现在,如果我将上面的if语句中的S_OK更改为E_ERROR,那就没问题。我读到在C ++中枚举是全局的所以我认为这就是它与这个VS混合的原因。我对C ++编程几乎一无所知。从C调用C ++代码,我有类似的例子,没有命名空间。我认为它甚至不重要,因为我用完全命名空间的东西来引用S_OK。
谢谢&最好的祝福! -matti
答案 0 :(得分:2)
我认为#define
比命名空间更像问题。在使用它的代码之前尝试#undef S_OK
。