2011-04-14 106 views
3

herehere他们会谈论做什么,但我似乎无法在C++中找到我的c#项目。如何在C++中调用c#方法?

我在C++项目中添加了c#项目作为参考,但每当我尝试使用我需要的方法时,都找不到名称空间。我已经添加了它,通过右键单击C++项目并参考'然后添加c#项目添加新的参考。两个项目都在同一个解决方案中。

在下面的代码中,excamples给出了完整的c#代码(使用除外)和一部分C++代码(我试图调用c#方法的方法)。我还将一些命名空间更改为更通用并且不包含敏感信息。

c#代码是这样的。

namespace Company.Pins.Bank.Decryption 
{ 

    public class Decrypt 
    {  
     [DllImport("decryptsn.dll", CallingConvention = CallingConvention.Cdecl)] 
     public static extern IntPtr decryptsn(byte[] InpData); 
     //__declspec(dllimport) char* decryptsn(char* InpData); 

     public static String Decryption(string param2) 
     { 
      byte[] InpData = new byte[255]; 
      InpData = StrToByteArray(param2);  
      return Marshal.PtrToStringAnsi(decryptsn(InpData)); 
     } 

     public static byte[] StrToByteArray(string str) 
     { 
      System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
      return encoding.GetBytes(str); 
     }  
    } 
} 

C++代码

CPReSInterfaceApp theApp; 

extern "C" DllExport BOOL WINAPI UserInstruction(
        HWND hWnd, HINSTANCE hInst, double* lpNumeric, 
        TCHAR* lpAlpha1, TCHAR* lpAlpha2) 
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    if (lpNumeric == NULL || lpAlpha1 == NULL || lpAlpha2 == NULL) 
     return FALSE; 

    ReconcileUHParameter(lpNumeric, lpAlpha1, lpAlpha2); 

    int iCommand = (int)lpNumeric[0]; 

    lpNumeric[0] = 6; 
    lpAlpha2 = Company.Pins.Bank.Decryption.Decrypt.Decryption("123456"); 

    return TRUE; 
} 

回答

4

您需要添加一个#using directive to the code。例如,如果你的C#DLL被命名为Decrypt.dll,这种添加到C的顶部++ compiland:

#using "Decrypt.dll" 

您还需要确保C++代码调用托管的方法也被编译为使用/clr管理编译器选项。

此外,我相信你需要使用::作为命名空间分隔符,而不是.

lpAlpha2 = Company::Pins::Bank::Decryption::Decrypt::Decryption("123456"); 
+0

对不起,如果我听起来很笨,但添加clr给我'/ RTC1'和'/ clr'命令行选项是不兼容的。这似乎是一个很好的解决方案,删除/ RTC1之一,但这些是灰色的框,我不能改变它们。 – Andy 2011-04-14 15:53:39

+0

我设法找出他们在偏好的其他部分设置的选项。尽管我遇到了这个问题:错误D8016:'/ MT'和'/ clr'命令行选项不兼容。这个错误发生了很多次,但在这种情况下,我不能摆脱/ MT和所有其他选项似乎给错误。 – Andy 2011-04-14 16:02:16

+0

谷歌搜索这似乎我需要使用/ MD和#定义_AFXDLL。 – Andy 2011-04-14 16:09:36