Мне нужно вызывать функции 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;
}
}
}