2013-06-13 8 views
6

Ho un progetto di classe a.dll che è compilato in C#. Contiene il seguente codice.Come chiamare una funzione definita in C# con gli stessi parametri, tipo restituito e stesso nome ma in casi diversi da un progetto VB.NET

public class MyClass{ 
    public int Add(int i,int j) 
    { 
     return (i+j); 
    } 

    public int add(int i,int j) 
    { 
     return (i+j)*2; 
    } 
} 

da un progetto C# posso chiamare queste funzioni come questo

public class MyOtherClass{ 
MyClass mcls=new MyClass(); 
mcls.Add(1,2); 
mcls.add(2.3); 
} 

ma come posso chiamare questo da un VB.Net Project? Non sono in grado di utilizzare Visual Studio in questo momento. Quindi è molto utile se qualcuno fornirà una risposta.

EDIT 1

Sto avendo un progetto VB.NET e ho bisogno di aggiungere il riferimento di un C# dll (say dll contains MyClass) .Così che posso chiamare due metodi (Add(int,int) , add(int,int)). Ma in VB.NET questo è case sensitive. C'è un modo per raggiungere questo obiettivo?

EDIT 2

Supponiamo ho aggiunto riferimento alla DLL e quindi posso in grado di chiamare le funzioni.

Dim myObj as New MyClass 
myObj.Add(1,2) 
myObj.add(1,2) 

Se questo codice funziona come il compilatore identifica la funzione corretta?

+0

Perché non solo rinominare aggiungere ad AddAndDouble? – Andy

+0

+1 buona logica! ma viola le linee guida CLS –

risposta

5

La cosa migliore è quella di utilizzare la riflessione qui - VB semplicemente non in grado di determinare quale funzione si sta chiamando dal momento che in VB 'add' è identica a 'Add'.

Ecco che cosa ho fatto di provarlo (io non sono proprio sicuro che '' BindingFlags è necessario combinare qui):

Dim mcls As New [MyClass] 
Dim t As Type = mcls.GetType() 
Dim x = t.InvokeMember("add", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, mcls, New Object() {1, 2}) 
Dim y = t.InvokeMember("Add", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, mcls, New Object() {1, 2}) 
+0

L'ho solo semplificato un po '- non hai bisogno di un carico di montaggio separato - è già caricato, quindi basta usare 'GetType'. –

+0

Grazie. è una risposta adeguata. – kbvishnu

2

se il codice C# è compatibile con CLS, si può semplicemente aggiungere un riferimento ad esso per la vostra project.namespace vb.net, membri pubblici del DLL possono essere acessed


Maggiori informazioni qui
http://www.christec.co.nz/blog/archives/290

È inoltre possibile utilizzare gratuitamente gli strumenti di convogliamento online.
esempio: http://www.developerfusion.com/tools/convert/vb-to-csharp/

aggiornamento:

Leggi questo http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/dda8d7cb-0fa1-43d6-a90f-6c4bed0b40bb

Dim c As New MyClass() 
MsgBox(c.Add(1, 2)) 'if only Add() is Available 


Update2: * Come da link qui sopra Nota: *

Inoltre, nel progetto C#, aggiungere il seguente al AssemblyInfo.cs:

using System; 

// etc 

[assembly: CLSCompliant(true)] 

Update3:

come ho detto sopra si desidera per garantire che si codice C# è compatibile con CLS.
C# fa distinzione tra maiuscole e minuscole, dove VB.NET non è.si sta violandolinee guida CLS
Nota Bene Update2 per garantire la natura compatibile

Finalmente ho trovato l'articolo che mi ha guidato tempo fa

http://www.devarticles.com/c/a/C-Sharp/Making-Your-Code-CLS-Compliant/

Update4:

un altro ambito http://msdn.microsoft.com/en-us/magazine/cc163750.aspx

+0

Ho aggiunto riferimento e come chiamare la funzione? – kbvishnu

+0

puoi controllare la domanda aggiornata – kbvishnu

+0

Non penso che questo abbia qualcosa a che fare con la domanda .. – Andy

1

realtà VB non ti consente di chiamare sia Add metodo con nome. Si otterrà un errore del compilatore che indica che il nome Add è ambiguo. Dare due nomi di membri pubblici che differiscono solo per casi non è conforme a CLS. Chiama la persona che ha scritto la classe C# e digli di usare nomi conformi a CLS. Se non lo faranno, dovrai ricorrere alla riflessione.

+0

concordato la tua opinione. +1 :) Questa domanda è una domanda dell'intervista rivolta al mio amico e ha verificato con me una soluzione. Grazie – kbvishnu

+0

@VeeKayBee per favore fatemi sapere se ho ottenuto il lavoro :) –

+0

Sicuro. è selezionato, ma non ha idea della risposta alla sua domanda – kbvishnu

Problemi correlati