Что-то вроде этого должно сделать это:
Assembly assembly = Assembly.LoadFrom("Reports.dll");
Stream stream = assembly.GetManifestResourceStream("Reports.MyReport.rdlc");
reportViewer.LocalReport.LoadReportDefinition(stream);
Насколько я знаю, кроссплатформенный способ не существует.
Для Linux: readlink / proc / self / exe
Windows: GetModuleFileName
Следующее работает как быстрое и грязное решение, но учтите, что оно далеко не надежно:
#include <iostream>
using namespace std ;
int main( int argc, char** argv)
{
cout << argv[0] << endl ;
return 0;
}
Для Windows вы можете использовать GetModuleFilename ().
Для Linux см. BinReloc (старый, несуществующий URL) зеркало BinReloc в репозиториях datenwolf на GitHub .
Этот способ использует boost + argv. Вы упомянули, что это не может быть кросс-платформенный, потому что он может включать или не включать имя исполняемого файла. Следующий код должен обойти это.
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <iostream>
namespace fs = boost::filesystem;
int main(int argc,char** argv)
{
fs::path full_path( fs::initial_path<fs::path>() );
full_path = fs::system_complete( fs::path( argv[0] ) );
std::cout << full_path << std::endl;
//Without file name
std::cout << full_path.stem() << std::endl;
//std::cout << fs::basename(full_path) << std::endl;
return 0;
}
Следующий код получает текущий рабочий каталог, который может делать то, что вам нужно.
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <iostream>
namespace fs = boost::filesystem;
int main(int argc,char** argv)
{
//current working directory
fs::path full_path( fs::current_path<fs::path>() );
std::cout << full_path << std::endl;
std::cout << full_path.stem() << std::endl;
//std::cout << fs::basepath(full_path) << std::endl;
return 0;
}
Примечание
Только что понял, что basename (
) устарело, поэтому пришлось переключиться на .stem ()