如何在C++中调用C#方法?

3

这里这里讨论了如何做,但我好像无法在C++中找到我的C#项目。

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

在下面的代码示例中,我提供了完整的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;
}
1个回答

4

您需要在代码中添加#using指令。例如,如果您的C# dll名称为Decrypt.dll,请将以下内容添加到您的C++编译器的顶部:

#using "Decrypt.dll"

你还需要确保调用托管方法的C++代码也使用/clr编译器选项编译为托管代码。
此外,我认为你需要使用::作为命名空间分隔符,而不是.
lpAlpha2 = Company::Pins::Bank::Decryption::Decrypt::Decryption("123456");

抱歉如果我听起来有点傻,但添加clr会给我带来“/RTC1”和“/clr”命令行选项不兼容的错误。删除/RTC1似乎是一个好的解决方案,但这些选项所在的框已被禁用,我无法更改它们。 - Andy
我成功地找到了它们在其他偏好设置部分中的选项。但是我遇到了一个问题:错误 D8016:'/MT' 和 '/clr' 命令行选项不兼容。这个错误发生了很多次,但在这种情况下,我无法摆脱 /MT,所有其他选项似乎都会出错。 - Andy
通过谷歌搜索,似乎我需要使用 /MD 和 #define _AFXDLL。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接