web-dev-qa-db-fra.com

C #: le type 'Microsoft.Reporting.WebForms.ReportViewer' existe à la fois dans ReportingServicesWebUserInterface.dll et dans Microsoft.ReportViewer.WebForms.dll

Après avoir recherché un grand nombre de messages similaires, j’ai décidé de créer mon propre message.

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS0433: 
The type
    'Microsoft.Reporting.WebForms.ReportViewer' 
exists in both 
    'c:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\reportmanager\Bin\ReportingServicesWebUserInterface.dll'
and
    'c:\WINDOWS\Assembly\GAC_MSIL\Microsoft.ReportViewer.WebForms\9.0.0.0__b03f5f7f11d50a3a\Microsoft.ReportViewer.WebForms.dll'


Mettre à jour:

La plupart des publications similaires ont pour problème que leurs 2 DLL en conflit ont une version 8.0.0.0 et 9.0.0.0, ou presque. Ou qu'ils résident dans le dossier TEMPORARY. Je ne pense pas que mon problème puisse être résolu de la même manière avec de tels messages.

Il existe sur notre ReportServer un Report.aspx, qui rend un rapport. Je veux remplacer ce fichier par le mien, modifier la mise en page, comme ceci:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="WebApplication._Default" %>

<%@ Register 
    Assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms"
    TagPrefix="rsweb" %>

<!DOCTYPE>
<html>
    <head runat="server"></head>
    <body>
        <div>
            <form id="reportform" runat="server">
                <div>
                    <rsweb:ReportViewer
                        ID='ReportViewerRoot'
                        runat='server'
                        ProcessingMode='Remote'
                        Height='100%'
                        Width='100%'
                        AsyncRendering='False'
                        SizeToReportContent='True'
                    />
                </div>
            </form>
        </div>
    </body>
</html>

Cela nécessite une référence à MS.ReportViewer.WebForms.DLL

Mon fichier Project.csproj a ceci:

<Reference Include="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

Je n'ai pas pu désinstaller de DLL dans C:\WINDOWS, car il était indiqué que cela était requis pour d'autres applications.
WINDOWS\Assembly

J'ai également essayé de modifier web.config, en ajoutant quelques dépendances, mais je ne savais pas trop ce qui serait utile (cela était utile pour les différences de version mentionnées ci-dessus).

De plus, j'ai ces lignes dans web.config:

<compilation defaultLanguage="c#" debug="false" tempDirectory="C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\RSTempFiles\">
    <assemblies>
        <clear />
        <add Assembly="ReportingServicesWebServer" />
    </assemblies>
</compilation>

Merci pour votre contribution .. Je suis impatient de recevoir vos suggestions.

10
EricG

La solution satisfaisante!

Lors de l'insertion d'un objet ReportViewer dans l'aspx, la référence DLL est automatiquement ajoutée (et pointe vers le GAC WebForms). J'ai besoin de cette référence (impossible de réussir à référencer manuellement aux DLL GAC), puis je supprime ReportViewer dans l'aspx. De plus, j'ajoute la référence au DLL ReportingServicesWebUserInterface.DLL en conflit. Cela déplace le problème (sortie d'erreur de post) vers VS, au lieu de seulement sur le serveur SSRS.

Lors de l'ajout d'un nouveau ReportViewer (), j'obtiendrai l'erreur dans VS.

La solution est la suivante: donnez un alias à la non-requise DLL (sans l'utiliser réellement dans le code). Cela indiquera au compilateur que cette DLL ne doit pas être utilisée lors de l'utilisation de WebForms. Voir l'image

DLL references + alias

Report.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="MyWebApplication._Default" %>

<!DOCTYPE>

<html>
<head runat="server">
    <title></title>
</head>
<body>
    <div>
    <div style="background-color:Red;width:100px;height:100px;">Hoi</div>
    </div>
    <form id="formID" runat="server">
    test
    </form>
    <div>haha</div>
</body>
</html>


Report.aspx.cs

public partial class _Default : System.Web.UI.Page
{
    ReportViewer ReportViewerRoot;

    protected void Page_Load(object sender, EventArgs e)
    {
        AddRV();
    }

    public void AddRV()
    {
        ReportViewerRoot = new ReportViewer()

        formID.Controls.Add(ReportViewerRoot);

        SetReportViewer();
        SetServerReport();
    }

    public void SetReportViewer()
    {
        ReportViewerRoot.ID = "ReportViewerRoot";
        ReportViewerRoot.ProcessingMode = ProcessingMode.Remote;
    }

    private void SetServerReport()
    {
        ServerReport serverReport = ReportViewerRoot.ServerReport;

        // Set the report server URL and report path
        serverReport.ReportServerUrl = new Uri("http://localhost/reportserver");
        serverReport.ReportPath = Request.QueryString["ItemPath"];
        serverReport.Refresh();
    }
}


Source référence: Procédure pas à pas avec un alias externe

9
EricG

Je résous mon problème Pour supprimer l'assemblage unique de mon Web.ConfigIn My Case Les versions 10 et 11 sont réunies . I Supprimez le code ci-dessous de Config.

 <add Assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845DCD8080CC91"/>
1
Dilranjan Singh

Pas dans cette réponse, mais dans la réponse suivante, j'ai mis la solution satisfaisante !! :)


Cette solution même fonctionne aussi mais n’est pas satisfaisante en ce qui concerne le cycle de développement/lisibilité/maintenabilité.


Mon fichier Report.aspx ne contient que cette ligne:

<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Report.aspx.cs" Inherits="WebApplication._Default" %>


Mon rapport.aspx.cs contient du code tel que:

        HtmlGenericControl body = new HtmlGenericControl();
        HtmlForm form = new HtmlForm();
        ReportViewerRoot = new ReportViewer();

        Controls.Add(body);
        body.Controls.Add(form);
        form.Controls.Add(ReportViewerRoot);


Mon ReportManager/Web.config contient des balises supplémentaires telles que:

<!-- added enableSessionState -->
<pages validateRequest="false" enableSessionState="true" />

<httpModules>
    <clear />
    <!-- added -->
    <add name="Session"  type="System.Web.SessionState.SessionStateModule"/>
</httpModules>

<httpHandlers>
    <!-- added -->
    <add verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</httpHandlers>


P.s.:En aucun cas je ne peux combiner le code HTML dans report.aspx avec un reportviewer (ni aspx ni cs) . Je ne peux pas non plus ajouter le ReportViewer de manière dynamique dans l'aspx en utilisant <% AddRV(); %>


P.s.s . Le Web.config m'a aidé à résoudre ces erreurs:

En mode distant, le contrôle Report Viewer requiert que l'état de la session soit activé ou que les informations de connexion de Report Server spécifiées dans le fichier fichier de configuration.


Le gestionnaire HTTP du contrôle Web du visualiseur de rapports n'a pas été enregistré dans le fichier web.config de l'application. Ajoutez-le à system.web/httpHandlers section du fichier web.config.

0
EricG

Aller à 

HKEY_CLASSES_ROOT\Installer\Assemblies\Global

rechercher l'assemblage et supprimer la ligne complète en faisant un clic droit dessus et en choisissant supprimer.

0
Shakti Raturi

Cela peut également se produire si vous avez des applications imbriquées. c'est à dire. App2 à l'intérieur de App1.

Le fichier web.config d'App1 pourrait être dérangé par celui d'App2 Assurez-vous qu'ils ne font pas référence à différentes versions du même assemblage.

0
Jason Geiger

Inclut dans web.config une balise dependAssembly pour forcer la version spécifique:

<runtime>
  <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
     <dependentAssembly>
        <assemblyIdentity name="Microsoft.ReportViewer.WebForms" publicKeyToken="89845dcd8080cc91" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
      </dependentAssembly>
0
Rigel Aguilar