DLL en c#

Iniciado por elvehe, 23 Marzo 2015, 23:17 PM

0 Miembros y 1 Visitante están viendo este tema.

elvehe

veran acabo de acer un dll en c# .Yo se que un dll no deja ver el codigo que se encuentra en el mismo, pero cuando estoy usandolo en otro proyecto y ocurre una excepcion no controlada el depurador de visual me manda al codigo de donde ocurrio la exepcion en el dll. 
como le ago para que no ocurra esto.¿acaso tengo que controlar todas los errores de ejecucion en mi dll antes de generarlo, para que quienes lo usen no puedan acceder al codigo?

Eleкtro

Cita de: elvehe en 23 Marzo 2015, 23:17 PMpero cuando estoy usandolo en otro proyecto y ocurre una excepcion no controlada el depurador de visual me manda al codigo de donde ocurrio la exepcion en el dll.

Tú mismo te estás respondiendo, eres tú quien tiene VS instalado y quien tiene el depurador de VS adjuntado, por ese motivo se te muestra el código fuente que ha generado la excepción.

Cualquier otro PC que no disponga de VS instalado y que no tenga activado/adjuntado el depurador de VS en el S.O, y que además no disponga de los archivos de base de datos de depuración (PDB) entonces no debería poder acceder de forma accidental al código fuente del ensamblado al generarse una excepción,
y digo de forma "accidental" por que el código fuente siempre será accesible para cualquier persona que tuviese un conocimiento básico sobre ingenieria inversa mediante Reflection (hay herramientas que facilitan la tarea, como .Net Reflector), a menos que protejas el código mediante empaquetado u ofuscación y esa persona no sea capaz de encontrar la forma de revertir dicha protección.

Cita de: elvehe en 23 Marzo 2015, 23:17 PM¿acaso tengo que controlar todas los errores de ejecucion en mi dll antes de generarlo, para que quienes lo usen no puedan acceder al codigo?

Pues... hombre, si el código que estás manipulando lanza una excepción entonces desde luego que algo hay mal y eso significa que deberías tratar de corregirlo y/o controlar la excepción, todas las excepciones que haya y además las excepciones que puedas preveer, claro está.

De todas formas, y aunque estas técnicas no te las aconsejo EN ABSOLUTO por ser motivo de MUY malas prácticas de programación:

· En Vb.Net puedes ignorar las excecpciones de un bloque de código específico usando la declaración "On Error" (On Error Resume Next), en C# creo que no existe un equivalente.

· Puedes controlar todas las excepciones de un proyecto, suscribiéndote a los siguientes eventos de la aplicación:
AppDomain.CurrentDomain.FirstChanceException, AppDomain.CurrentDomain.UnhandledExceptiony Application.ThreadException,
pero ten en cuenta que la ejecución se seguirá deteniendo al encontrar una excepción, y se seuirá reportando la excepción.
Es algo muy sencillo pero si quieres un mayor control puedes hacer lo mismo con la librería NByg: https://nbug.codeplex.com/

· Otra alternativa para ignorar las excepciones sería ejecutar todos los bloques de código pasando las instrucciones cómo parámetro de un método que recibiese cómo parámetro una expresión Lambda, por ejemplo:
Código (vbnet) [Seleccionar]
    Public Shared Sub IgnoreExceptions(ByVal action As Action)

        Try
            action.Invoke()

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        End Try

    End Sub

    Private Sub Test()

        IgnoreExceptions(Sub()
                             IO.File.Open("", IO.FileMode.Open)
                         End Sub)

    End Sub


· Por último, otra alternativa para ignorar todas las excepciones, y mi favorita (aunque nunca he tratado de hacerlo de esta manera), sería utilizando técnicas del paradigma AOP (Aspect Oriented Programming),
te recomiendo utilizar la librería PostSharp para facilitar dicha tarea, para decorar el código fuente de tal manera que puedas añadir atributos (o Aspects) a un método para ignorar las excepciones.
Aquí tienes un ejemplo: http://www.rhyous.com/2012/06/15/aop-implementing-try-catch-in-csharp-with-postsharp/

PD: No se si con la versión gratuita de PostSharp se podrá hacer.

Saludos