none
Utilizar classe VB em uma classe C# RRS feed

  • Pergunta

  • Olá.

    Pessoal, como faço para acessar os métodos de uma classe VB de dentro de uma classe C#. Estou desenvolvendo em um projeto que foi feito em visual basic, é um website, e preciso utilizar as classes que já foram desenvolvidas em minha aplicação, que é em C#, só que não consigo chamar a classe VB dentro de minha classe C#.

    Por exemplo:

    using Oracle.DataAccess.Client;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    public class clsPimUsuario
    {
    	private readonly clsOracle _oracle = new clsOracle();
    
        public string Unidade(OracleConnection conn, int cod_usuario)
        {
            var myCommand = new OracleCommand();
            myCommand.Connection = conn;
            myCommand.CommandText = "SELECT DESCR_UNIDADE FROM UAAWEB.VISAO_USUARIO WHERE COD_USUARIO = :COD_USUARIO DESCR_UNIDADE";
            myCommand.Parameters.Clear();
            myCommand.Parameters.Add("COD_USUARIO", OracleDbType.Int16).Value = cod_usuario;
            conn.Open();
    
            return "";
        }
    }

    A classe demonstrada acima é minha classe C# e a classe que está sendo instânciada é a classe VB, só que a aplicação não reconhece está classe.

    Alguém sabe como posso fazer isso?

    quinta-feira, 25 de setembro de 2014 13:20

Respostas

  • Confirmado.. o problema é seu codeSubDirectories

    Veja, essa propriedade é usada para definir a ordem de compilaçao. Como pim é compilado primeiro, ela ainda nao conhece as outras classes.

    Fiz uma nova simulaçao aqui e consegui reproduzir o seu problema.

    Primeiro, como eu ja tinha dito, vc nao pode colocar dois codigos em linguagesn diferentes dentro de um unico appcode.. vc vai ter que dividir em VBCODE e CSCODE... 

    compilation debug="false"> <codeSubDirectories> <add directoryName="VBCode" /> <add directoryName="CSCode" /> </codeSubDirectories> </compilation>

    Veja o erro que eu recebi quando eu criei um estrutura identica a sua:

    web.config

    <compilation debug="false">
        <codeSubDirectories>
            <add directoryName="PIN" />
        </codeSubDirectories>
    </compilation>

    resultado build:

    ------ Rebuild All started: Project: WebSite1(1), Configuration: Debug Any CPU ------
    Validating Web Site
    Building directory '/App_Code/PIN/'.
    
    C:\Users\WilliamJohn\Documents\Visual Studio 2013\WebSites\WebSite1\App_Code\Pin\Class2.cs(16,9): error CS0246: The type or namespace name 'Class1' could not be found (are you missing a using directive or an assembly reference?)
    C:\Users\WilliamJohn\Documents\Visual Studio 2013\WebSites\WebSite1\App_Code\Pin\Class2.cs(16,24): error CS0246: The type or namespace name 'Class1' could not be found (are you missing a using directive or an assembly reference?)
    Validation Complete
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

    Veja minha configuraçao de soluçao:

    Se eu removo o codeSubDirectories do meu Webconfig, entao o problema muda:

    ------ Rebuild All started: Project: WebSite1(1), Configuration: Debug Any CPU ------
    Validating Web Site
    Building directory '/App_Code/'.
    : Build (web): The files '/App_Code/Pin/Class2.cs' and '/App_Code/Class1.vb' use a different language, which is not allowed since they need to be compiled together.
    
    Validation Complete
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
    Note a mensagem.. nao é possiviel compilar duas linguagens difenrentes na mesma Pasta (neste caso APP_CODE)

    A soluçao:

    1 - Criar duas novas pastas: VBCode e CSCode

    2- Mover todo codigo VB (e suas subpastas) para VBCode e todo codigo C# para CSCode

    Minha soluçao final ficou assim:

    Depois de recompilar:

    ------ Rebuild All started: Project: WebSite1(1), Configuration: Debug Any CPU ------
    Validating Web Site
    Building directory '/CSCode/Pin/'.
    Building directory '/VBcode/'.
    
    Validation Complete
    ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    sexta-feira, 26 de setembro de 2014 15:13
    Moderador

Todas as Respostas

  • Seu projeto VB esta em uma classe à parte, certo?

    Basta refenreciar esse projeto VB no seu projeto C# e usar a classe, deste jeito:

    1-adicione uma referencia ao seu projeto C# (botao direito sobre o projeto so gerenciador de soluçao)

    2-Selecione soluçao no lado esquerdo, e depois projeto, isso vai listar todas os projetos da sua soluçao.

    3 - Lembre-se de usar o namespace, tipo se sua classe chama-se teste e ela fica dentor do name space testes, entao a chamada dessa classe dentro do c# fica assim:

    Testes.Teste t=new Testes.Teste();
    e.executarTeste();

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 25 de setembro de 2014 14:01
    Moderador
  • No seu caso:

    private readonly vbproject.clsOracle _oracle = new vbproject.clsOracle();

    faltou explicitar o name space.. poste aqui um pouco do seu codigo Vb para que possamos ajudar mais.

    Lembre-se que se vc nao especifica o namespace, entao o .NET procura essa classe no namespace atual.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 25 de setembro de 2014 14:04
    Moderador
  • Olá William, obrigado por seu retorno, mas no meu caso é um Website, ou seja, VB e C# estão juntos, segue a imagem do projeto:

    quinta-feira, 25 de setembro de 2014 14:15
  • Entao neste caso o problema é somente o namespace.

    Verifique se seu webconfig tem essa configuraçao:

    <compilation debug="false">
        <codeSubDirectories>
            <add directoryName="VBCode" />
            <add directoryName="CSCode" />
        </codeSubDirectories>
    </compilation>

    fonte:http://msdn.microsoft.com/en-us/library/t990ks23.aspx

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 25 de setembro de 2014 14:25
    Moderador
  • Sim, ele está.

    Desta forma:

        <compilation batch="false" explicit="true" strict="false" targetFramework="4.5">
          <codeSubDirectories>
            <add directoryName="pim" />
          </codeSubDirectories>
        </compilation>


    quinta-feira, 25 de setembro de 2014 14:29
  • Dentro de "Pim" vc coloca vb e c#?? Isso nao é indicado.

    Ainda acho que o problema esta no namespace... verifique isso.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 25 de setembro de 2014 14:35
    Moderador
  • Não, dentro do PIM é só C#, veja a imagem da pasta app_code:

    Estou utilizando a class clsPimUsuario.cs e quero chamar a classe clsOracle.vb e é ela que não estou conseguindo utilizar.


    quinta-feira, 25 de setembro de 2014 14:39
  • Sim.. eu entendi isso.. .mas qual é o namespace da classe clsOracle?

    Se possivel poste aqui as primeiras 30 linhas dessa classe e as 30  primeiras linhas da classe clsPimUsuario

    Com certeza o problema esta na definiçao do namespace.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 25 de setembro de 2014 15:40
    Moderador
  • class clsOracle.vb

    Imports Microsoft.VisualBasic
    Imports Oracle.DataAccess.Client
    Imports System.Data
    
    Public Class clsOracle : Implements IDisposable
        Private disposed As Boolean = False
        Private _strConexao As String
        Private _transacao As OracleTransaction
        Private _con As OracleConnection
        Public Property Con() As OracleConnection
            Get
                Return _con
            End Get
            Set(value As OracleConnection)
                _con = value
            End Set
        End Property
    
        Private _comandoSQL As OracleCommand
        Public Property ComandoSQL() As OracleCommand
            Get
                Return _comandoSQL
            End Get
            Set(value As OracleCommand)
                _comandoSQL = value
            End Set
        End Property
    
    
        Public Sub New()
            _strConexao = System.Web.HttpContext.Current.Session("STRCONEXAO").ToString
            _con = New OracleConnection(_strConexao)
            _comandoSQL = New OracleCommand()
            _comandoSQL.Connection = _con
            _con.Open()
        End Sub
    
        'Public Sub New(ByVal stringConexao As String)
        '    _strConexao = stringConexao
        '    _con = New OracleConnection(_strConexao)
        '    _comandoSQL = New OracleCommand()
        '    _comandoSQL.Connection = _con
        '    _con.Open()
        'End Sub
    
        Public Function ExecutarSelectDr() As OracleDataReader
            Dim dr As OracleDataReader = _comandoSQL.ExecuteReader()
            Return dr
        End Function
    
        'Public Function ExecutaSelect(Optional gerenciaConexao As Boolean = False) As DataTable
        '    If _comandoSQL.CommandText.Trim = String.Empty Then
        '        Throw New Exception("Não há instrução SQL a ser executada.")
        '    End If
        '    Dim dt As New DataTable
        '    AbreConexao(gerenciaConexao)
        '    Try
        '        dt.Load(_comandoSQL.ExecuteReader())
        '        _comandoSQL.ExecuteReader().Close()
        '    Catch ex As Exception
        '        dt = Nothing
        '        Throw New Exception("Erro ao executar a instrução SQL: " & ex.Message, ex)
        '    Finally
        '        FechaConexao(gerenciaConexao)
        '    End Try
        '    Return dt
        'End Function
    
        Public Function ExecutaSelect() As DataTable
            If _comandoSQL.CommandText.Trim = String.Empty Then
                Throw New Exception("Não há instrução SQL a ser executada.")
            End If
            Dim dt As New DataTable
            Try
                dt.Load(_comandoSQL.ExecuteReader())
                _comandoSQL.ExecuteReader().Close()
            Catch ex As Exception
                dt = Nothing
                Throw New Exception("Erro ao executar a instrução SQL: " & ex.Message, ex)
            End Try
            Return dt
        End Function

    class clsPimUsuario.cs

    using Oracle.DataAccess.Client;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    public class clsPimUsuario : System.Web.UI.Page
    {
        public string Unidade(int cod_usuario)
        {
           
    
            var myCommand = new OracleCommand();
            myCommand.CommandText = "SELECT DESCR_UNIDADE FROM UAAWEB.VISAO_USUARIO WHERE COD_USUARIO = :COD_USUARIO DESCR_UNIDADE";
            myCommand.Parameters.Clear();
            myCommand.Parameters.Add("COD_USUARIO", OracleDbType.Int16).Value = cod_usuario;
    
            return "";
        }
    }

    quinta-feira, 25 de setembro de 2014 15:49
  • Faltou defini o namespace na class VB

    Namespace VbCode
    
    /*
    class .....
    
    */
    
    End Namespace 


    quinta-feira, 25 de setembro de 2014 19:12
  • Olhe.. eu fiz um teste aqui. Tem alguma coisa errada com seu projeto

    Como voce pode ver eu criei duas classes, uma em VB e outra em C#... Na classe C# eu instancio e chamo um metodo da classe VB sem nenhum problema.

    Verifique se uma classe em Vb consegue chamar um metodo de outra classe em VB... 

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 25 de setembro de 2014 19:24
    Moderador
  • O seu caso só funcionou porque as duas classes estão sem namespace na situação do Anderson  uma das classes esta dentro de um Namespace e a outra não
    quinta-feira, 25 de setembro de 2014 19:29
  • Nao... Ele postou o codigo das duas classe envolvidas... As duas estao sem namespace, da mesma forma que a minha simulaçao.. ainda acho que é o web.config que ta fazendo besteira.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 25 de setembro de 2014 19:56
    Moderador
  • Realmente deve ter algo estranho, agradeço a todos pelas respostas, mas fiz estes testes de namespace, de criar outra classe para tentar acessar e mesmo assim não funcionou.

    Segue o código do meu web.config

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <system.webServer>
        <httpProtocol>
          <customHeaders>
            <clear />
            <add name="X-UA-Compatible" value="IE=edge" />
          </customHeaders>
        </httpProtocol>
        <handlers>
          <add name="ChartImg" path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </handlers>
            <caching>
                <profiles>
                    <add extension=".png" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
                    <add extension=".gif" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
                    <add extension=".jpg" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
                    <add extension=".js" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" duration="00:00:30" />
                    <add extension=".css" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" duration="00:00:30" />
                </profiles>
            </caching>
      </system.webServer>
      <location path="_design">
        <system.web>
          <authorization>
            <allow users="*" />
          </authorization>
        </system.web>
      </location>
      <location path="_script">
        <system.web>
          <authorization>
            <allow users="*" />
          </authorization>
        </system.web>
      </location>
      <location path="teste">
        <system.web>
          <authorization>
            <allow users="*" />
          </authorization>
        </system.web>
      </location>
      <system.web>
        <globalization culture="pt-BR" uiCulture="pt-BR" />
        <customErrors mode="Off" />
        <compilation batch="false" explicit="true" strict="false" targetFramework="4.5">
          <codeSubDirectories>
            <add directoryName="pim" />
           
          </codeSubDirectories>
          <assemblies>
            <add assembly="Oracle.DataAccess, Version=2.111.6.20, Culture=neutral, PublicKeyToken=89B483F429C47342" />
          </assemblies>
        </compilation>
        <pages clientIDMode="Static" theme="extranet2014" styleSheetTheme="extranet2014" maintainScrollPositionOnPostBack="true" />
        <httpRuntime targetFramework="4.5" />
        <authentication mode="Forms">
          <forms name=".uaaextranet4" loginUrl="logon.aspx" protection="All" path="/" timeout="30" requireSSL="false" slidingExpiration="true" defaultUrl="default.aspx" />
        </authentication>
        <authorization>
          <deny users="?" />
          <allow users="*" />
        </authorization>
      </system.web>
      <appSettings>
        <add key="ChartImageHandler" value="Storage=file;Timeout=20;Url=~/tempimg/;" />
        <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
      </appSettings>
    </configuration>

    sexta-feira, 26 de setembro de 2014 10:12
  • Faça um teste.. remova essa parte:

          <codeSubDirectories>
            <add directoryName="pim" />
           
          </codeSubDirectories>

    E recompile (rebuild) a soluçao.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 26 de setembro de 2014 13:04
    Moderador
  • Mas se eu remover estas informações a aplicação não consegue localizar a classe que está dentro App_Code/pim
    sexta-feira, 26 de setembro de 2014 13:59
  • Confirmado.. o problema é seu codeSubDirectories

    Veja, essa propriedade é usada para definir a ordem de compilaçao. Como pim é compilado primeiro, ela ainda nao conhece as outras classes.

    Fiz uma nova simulaçao aqui e consegui reproduzir o seu problema.

    Primeiro, como eu ja tinha dito, vc nao pode colocar dois codigos em linguagesn diferentes dentro de um unico appcode.. vc vai ter que dividir em VBCODE e CSCODE... 

    compilation debug="false"> <codeSubDirectories> <add directoryName="VBCode" /> <add directoryName="CSCode" /> </codeSubDirectories> </compilation>

    Veja o erro que eu recebi quando eu criei um estrutura identica a sua:

    web.config

    <compilation debug="false">
        <codeSubDirectories>
            <add directoryName="PIN" />
        </codeSubDirectories>
    </compilation>

    resultado build:

    ------ Rebuild All started: Project: WebSite1(1), Configuration: Debug Any CPU ------
    Validating Web Site
    Building directory '/App_Code/PIN/'.
    
    C:\Users\WilliamJohn\Documents\Visual Studio 2013\WebSites\WebSite1\App_Code\Pin\Class2.cs(16,9): error CS0246: The type or namespace name 'Class1' could not be found (are you missing a using directive or an assembly reference?)
    C:\Users\WilliamJohn\Documents\Visual Studio 2013\WebSites\WebSite1\App_Code\Pin\Class2.cs(16,24): error CS0246: The type or namespace name 'Class1' could not be found (are you missing a using directive or an assembly reference?)
    Validation Complete
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

    Veja minha configuraçao de soluçao:

    Se eu removo o codeSubDirectories do meu Webconfig, entao o problema muda:

    ------ Rebuild All started: Project: WebSite1(1), Configuration: Debug Any CPU ------
    Validating Web Site
    Building directory '/App_Code/'.
    : Build (web): The files '/App_Code/Pin/Class2.cs' and '/App_Code/Class1.vb' use a different language, which is not allowed since they need to be compiled together.
    
    Validation Complete
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
    Note a mensagem.. nao é possiviel compilar duas linguagens difenrentes na mesma Pasta (neste caso APP_CODE)

    A soluçao:

    1 - Criar duas novas pastas: VBCode e CSCode

    2- Mover todo codigo VB (e suas subpastas) para VBCode e todo codigo C# para CSCode

    Minha soluçao final ficou assim:

    Depois de recompilar:

    ------ Rebuild All started: Project: WebSite1(1), Configuration: Debug Any CPU ------
    Validating Web Site
    Building directory '/CSCode/Pin/'.
    Building directory '/VBcode/'.
    
    Validation Complete
    ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    sexta-feira, 26 de setembro de 2014 15:13
    Moderador
  • Obrigado William, era isso mesmo.

    Problema resolvido.

    sexta-feira, 26 de setembro de 2014 18:05