Вызов DLL из C ++ из отчета служб отчетов - PullRequest
0 голосов
/ 15 марта 2012

У моей компании в настоящее время есть продукт, который использует отчеты 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?

Заранее благодарим за любую помощь в этом вопросе.

Ответы [ 2 ]

0 голосов
/ 31 марта 2015

Вам нужно сослаться на новую сборку DLL в файле RDL. Пример:

<CodeModules>
<CodeModule>DLL INFO</CodeModule>
</CodeModules>

Для получения дополнительной информации: https://msdn.microsoft.com/en-us/library/ms159238.aspx

Если вы используете VS, вы можете просто перейти в представление конструктора> Свойства отчета> Ссылки> Добавить сборки

0 голосов
/ 16 марта 2012

Исходя из исключения, вы, вероятно, не используете «полное доверие», которое требуется для вызова неуправляемого кода. Если вы размещаете это в IIS, вам нужно изменить конфигурацию пула приложений, если вы используете автономный исполняемый файл, вам нужно изменить уровень доверия в настройках проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...