Как вы вызываете ac # метод в C ++? - PullRequest
3 голосов
/ 14 апреля 2011

здесь и здесь они говорят о том, что делать, но мне кажется, что я не могу найти свой проект 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 голосов
/ 14 апреля 2011

Вам необходимо добавить # используя директиву к коду .Например, если ваша C # dll была названа Decrypt.dll, добавьте это в начало вашей компиляции C ++:

#using "Decrypt.dll"

Также необходимо убедиться, что код C ++, который вызывает управляемый метод, также скомпилирован какудалось с помощью опции компилятора /clr.

Кроме того, я считаю, что вам нужно использовать :: в качестве разделителя пространства имен, а не ..

lpAlpha2 = Company::Pins::Bank::Decryption::Decrypt::Decryption("123456");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...