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

Posted

技术标签:

【中文标题】如何在 c++ 中调用 c# 方法?【英文标题】:How do you call a c# method in c++? 【发布时间】:2011-04-14 15:34:26 【问题描述】:

here 和 here 他们确实在谈论要做什么,但我似乎无法在 c++ 中找到我的 c# 项目。

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

在下面的代码示例中,我给出了完整的 c# 代码(除了 usings)和部分 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】:

您需要添加#using directive to the code。例如,如果您的 C# dll 名为 Decrypt.dll,请将其添加到 C++ 编译器的顶部:

#using "Decrypt.dll"

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

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

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

【讨论】:

对不起,如果我听起来很愚蠢,但是添加 clr 会给我 '/RTC1' 和 '/clr' 命令行选项不兼容。删除 /RTC1 似乎是一个很好的解决方案,但是它们所在的框是灰色的,我无法更改它们。 我设法找出他们在偏好设置的其他部分设置的选项。我遇到了这个问题:错误 D8016:'/MT' 和 '/clr' 命令行选项不兼容。这个错误发生了很多次,但在这种情况下,我无法摆脱 /MT 并且所有其他选项似乎都会出错。 谷歌搜索似乎我需要使用 /MD 和 #define _AFXDLL。

以上是关于如何在 c++ 中调用 c# 方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 WP8 中从 C++ 代码调用 C# 方法

如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]

如何在 C++ 中创建和初始化双精度的 SAFEARRAY 以传递给 C#

如何在 C# 中编写我自己的包装器?

如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)

如何编写我的 C++ 函数以便我可以从 C# 调用它?