У моей компании в настоящее время есть продукт, который использует отчеты Crystal. Эти отчеты обращаются к пользовательской DLL C ++ (CRUFL) с большим количеством бизнес-логики для заполнения определенных полей в отчетах Crystal. Моя компания хочет, чтобы продукт был переведен на использование Reporting Services вместо Crystal Reports, и мне было поручено исследовать, как повторно использовать CRUFL dll в службах отчетности.
Мой следующий вопрос касается конкретно пути расследования, который я до сих пор прошел, но я был бы более чем открыт для любых и всех предложений о том, как еще решить эту проблему.
В другом продукте мы уже используем службы отчетов и выполняем пользовательские вызовы кода из файлов rdl в C # dll. Вооружившись этим знанием, я подумал, что смогу написать DLL-оболочку C #, которая делает вызовы P \ Invoke для DLL C ++.
Я начал с написания своего собственного кода на C ++ (для простоты) и добавил очень простой метод для возврата некоторого текста (может быть ясно, что я знаю только самый основной из C ++). В моем CPPFile.cpp у меня есть:
extern "C"
{
__declspec(dllexport) void ReturnTextFromDLL(char* & rtnStr)
{
rtnStr = "Some return string from inside the cpp dll! \n";
}
}
Затем я написал оболочку на C #, содержащую вызов метода c ++, описанный выше, а также метод тестирования, который не вызывает c ++:
public static class WrapperClass
{
[DllImport("TestCPP.dll")]
public static extern void ReturnTextFromDLL(out string output);
public static string DisplayHardcodedText()
{
return "Some hardcoded text in WrapperClass";
}
}
Теперь я создал простой RDL с двумя текстовыми полями. В разделе «Свойства отчета» я добавил ссылку на мой C # dll (CSharpWrapper) и добавил следующее под кодом:
Shared Function GetTextFromCPP() As String
Dim rtnStr As String = ""
CSharpWrapper.WrapperClass.ReturnTextFromDLL(rtnStr)
Return rtnStr
End Function
Shared Function GetHardCodedTextFromWrapper() As String
Return CSharpWrapper.WrapperClass.DisplayHardcodedText()
End Function
Для выражения текстовых полей у меня есть:
=Code.GetTextFromCPP()
и
=Code.GetHardCodedTextFromWrapper()
Я также скопировал обе библиотеки C ++ и C # в мои \ Common7 \ IDE \ PublicAssemblies.
При предварительном просмотре отчета в текстовом поле, вызывающем GetHardCodedTextFromWrapper (), отображается «Некоторый жестко закодированный текст в WrapperClass».
Однако в текстовом поле, в котором должен отображаться текст из метода C ++, отображается только «#Error». В окне вывода я получаю:
«Выражение Value для textrun 'Textbox2.Paragraphs [0] .TextRuns [0]' содержит ошибку: System.Security.Permissions.SecurityPermission"
Я сделал этот шаг назад и протестировал вне служб отчетов, написав быстрое консольное приложение на C #, и оно работало без проблем.
Я также попытался полностью развернуть отчет с помощью диспетчера отчетов и развернуть мои библиотеки в \ ReportServer \ bin, но он дал точно такой же результат.
Итак, я думаю, что я спрашиваю, возможно ли даже в службах отчетности сделать это? Если да, что мне нужно сделать, чтобы пройти SecurityPermission?
Заранее благодарим за любую помощь в этом вопросе.