Вызов библиотеки C # (среда выполнения 2.0) из C ++ (64-разрядное приложение, Visual Studio 2015) - PullRequest
0 голосов
/ 11 мая 2019

Мне нужно вызывать функции C # (SharpSVN API) из 64-разрядного приложения C ++ (без поддержки Common Language Runtime).
Функции C # находятся в Subversion DLL - SharpSvn.dll. Я использую довольно длинную схему: приложение C ++ (неуправляемый код) загружает мою библиотеку C ++ (с управляемым кодом), которая вызывает мою библиотеку C #, которая вызывает SharpSvn.dll
Проблема заключается в том, что SharpSvn.dll использует среду выполнения 2.0 (v2.0.50727), и этот параметр должен быть установлен в файле App.config. Но моя C ++ DLL (с ​​Common Language Runtime Support) игнорирует этот параметр - я получаю FileLoadException во время отладки.
Если вы используете Visual Studio 2008 для C ++ dll и для c # dll - все работает нормально, но есть исключения, когда вы вызываете эту dll из приложения Visual Studio 2015.
Я не могу узнать, как решить эту проблему.

1) https://sharpsvn.open.collab.net/docs/walkthrough.htm - "Если вы похожи на меня и запускаете этот проект в Visual Studio 2010 с платформой .NET 4.0, вы, скорее всего, только что столкнулись с неприятной исключительной ситуацией FileLoadException, которая говорит что-то вроде" Сборка смешанного режима построена против версия "v2.0.50727" среды выполнения и не может быть загружена в среде выполнения 4.0 без дополнительной информации о конфигурации. "
2) Проблема SharpSVN и C # Проблема SharpSVN и C #

Приложение C ++ (без CLR)

std::wstring msg_loc;
s_svn->CheckOut(db_path, working_d_path, user_name, user_passwd, file_path, msg_loc);
if (!msg_loc.empty()) MessageBox(msg_loc.c_str());

C ++ dll (с управляемым кодом)

SS_state SVN_extern::CheckOut(const std::wstring &db_uri, const std::wstring &wd_path,const std::wstring &user_name, const std::wstring &u_passwd,const std::wstring &Path1,std::wstring &Mess,bool ignore_db_diff)
{
 M_SVN_Class ^tmp = gcnew M_SVN_Class();
 Mess = L"c# class created.";

 String ^msg = L"";
 SS_state res;

 try {
      if (tmp->MyCheckOut(db_path, working_d_path, u_name ,user_passwd, file_path, msg, ignore_db_diff)) res = SUCCESS;
      else res = FAILURE;
      Mess = marshal_as<wstring>(msg);
     }
     catch (...) {
      res = FAILURE;
      Mess = L"Checkout exception";
     }

     return res;

   }
}

C # dll

 public bool MyCheckOut(string db_uri, string wd_path, string user_name, string u_passwd, string file_path, ref string Mess, bool ignore_db_diff)
 {
      using (SvnClient client = new SvnClient())
      {

         try
         {
             client.Authentication.ForceCredentials(user_name, u_passwd);

             SvnUpdateResult result;
             SvnCheckOutArgs args = new SvnCheckOutArgs();

             client.Lock(file_path, "");
             return true;

         }
         catch (SvnException se)
         {
              Mess = se.Message;
              return false;
         }
         catch (UriFormatException ufe)
         {
              Mess = ufe.Message;
              return false;
         }
      }
 }
...