[Ayuda] Crear Archivo .asi (.dll) para GTA:SA | ASILOADER

Iniciado por **Aincrad**, 17 Octubre 2019, 18:09 PM

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

**Aincrad**

Un archivo .asi es una .dll solo con la extensión cambiada.

el Juego GTA San Andrea tiene un complemento llamado ASILOADER que basicamente lee todos los archivos .asi en el directorio del juego y los injecta o algo asi. (recordando q un .asi es un .dll)

los ejemplos de como crear un .asi para GTA SA estan en C++ estoy intentando pasarlo a vb.net pero no se si se podra. .-.

Siguiendo este tutorial uno puede crear fácilmente un .asi para el juego : [ C++ ] Создание мода для GTA SA

codigo c++ =

Código (cpp) [Seleccionar]
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <stdio.h>

void Debug(char* text);
BOOL WINAPI DllMain(HINSTANCE dllHistance, DWORD callReason, void* reserved)
{
        switch (callReason)
        {
                case DLL_PROCESS_ATTACH:
                {
                        Debug("Loading");
                        break;
                }
                case DLL_PROCESS_DETACH:
                {
                        break;
                }
                default:
                {
                        break;
                }
        }
        return TRUE;
}
void Debug(char* text)
{
        FILE* fichier = fopen("debug.txt", "a");
        if (fichier == 0) fichier = fopen("debug.txt", "w");
        fwrite(text, strlen(text), 1, fichier);
        fputs("\r\n", fichier);

        fclose(fichier);
}


Lo que he intentado :

Código (vbnet) [Seleccionar]
Public Const DLL_PROCESS_ATTACH = 1

        Public Const DLL_PROCESS_DETACH = 0

        Public Function DllMain(ByVal dllHistance As IntPtr, ByVal callReason As Integer, ByVal reserved As Object) As Boolean
            Select Case callReason
                Case DLL_PROCESS_ATTACH
                    Debug("Loading")
                    Return True
                Case DLL_PROCESS_DETACH
                    Return False
            End Select
            Return False
        End Function

        Public Sub Debug(ByVal texto As String)
            System.IO.File.WriteAllText("debug.txt", texto)
        End Sub


Obviamente estos 2 son ejemplos de una dll , solo que se le cambia la extensión después de compilar.




Entonces , por que no me funciona mi código en vb.net y si el de c++? / que estoy haciendo mal? / Tiene algo que ver con el punto de entrada a la dll en vb que no esta siendo llamada?

Gracias de antemano...







Eleкtro

#1
Ese programa al parecer trabaja con librerías nativas (código nativo), no con ensamblados .NET (código IL)...

Cita de: https://support.microsoft.com/es-es/help/815065/what-is-a-dllUn ensamblado es una unidad lógica de funcionalidad que se ejecuta bajo el control de .NET common language runtime (CLR). Un ensamblado existe físicamente como un archivo .dll o como un archivo .exe. Sin embargo, internamente un ensamblado es muy diferente desde un archivo DLL Win32 de Microsoft.

En resumen, para compilar ese tipo de archivo dll deberías usar C++ como en el ejemplo que encontraste. En VB.NET es imposible, aunque cabe mencionar que en Visual C++ puedes compilar una DLL "mixta"...


pero eso seguiría siendo practicamente una dll con instrucciones IL, así que no creo que ese programa lo pueda cargar... pero bueno, lo cierto es que nunca lo he intentado ni tampoco he analizado el interior de este tipo de dll de código "mixto" para saber cuan compatible es nativamente hablando.

Saludos.








**Aincrad**

#2
Y Seria posible crear en c++ un .ASI que llame a una funcion dll (vb.net) ?

haria algo asi como un puente:

ASILOADER ------- .ASI FILE (C++) --------------- .DLL (VB) ..

Pero en c++ se pueden hacer llamados a una dll creada en vb?




Eleкtro

#3
Cita de: **Aincrad** en 17 Octubre 2019, 19:41 PMen c++ se pueden hacer llamados a una dll creada en vb?

Tiene que ser una dll NATIVA, con las funciones que quieras utilizar, exportadas.

Si te empeñas en hacerlo utilizando VB.NET, (para esto he tenido que investigar) en teoría con .NET Core / CoreRT puedes compilar una dll nativa y crear los exports (funciones exportadas) muy facilmente mediante la clase de atributo 'NativeCallable', aquí tienes un ejemplo y creo que lo necesario para documentarte y practicar:



Para instalar los runtimes de .NET Core junto a las plantillas de proyecto (para el desarrollo de una dll) y demás, puedes hacerlo desde el instalador de Visual Studio.

PD: El ejemplo de arriba es para C#, pero .NET Core soporta VB.NET también...
Cita de: https://www.amarinfotech.com/difference-between-net-core-2-0-vs-net-framework.html.NET Core is the new cross-platform and open-source .NET framework to develop applications for all major operating system including Mac, Linux, and Windows. .NET Core supports UWP and ASP.NET Core only. ASP.NET Core is used to build browser-based web applications and currently, it does not support a desktop application with the user interface. Programmers can develop applications and libraries in C#, VB.NET, and F# in both runtimes.








**Aincrad**

#4
Gracias por la informacion. vere como le hago.




Como le hago? :V



Type 'NativeCallable' is not defined.

System.Runtime.InteropServices no contiene el metodo NativeCallable. o es la version de Framework que estoy usando q no tiene ese método?







Eleкtro

#5
Lee detenidamente la documentación del enlace de GitHub que he compartido:

Cita de: https://github.com/dotnet/corert/tree/master/samples/NativeLibrary#exporting-methodsExporting methods

For a C# method in the native library to be consumable by external programs, it has to be explicitly exported using the [NativeCallable] attribute. First define the System.Runtime.InteropServices.NativeCallableAttribute in your project, see here. The local definition of the NativeCallableAttribute is a temporary workaround that will go away once the attribute is added to the official .NET Core public surface.

Next, apply the attribute to the method

Es decir, tu tienes que definir la clase 'NativeCallableAttribute', de la misma manera en como está definida aquí:
Cita de: Elektro

Y por último, simplemente aplicas dicho atributo al método que quieras exportar, especificando el nombre del punto de entrada, es decir, lo que ya has mostrado en esa imagen.

Recuerda que puedes descargar el ejemplo oficial en C# desde GitHub para analizarlo y/o convertir el código a VB.NET:

EDITO: ahora que me doy cuenta, si el espacio de nombres donde definir la clase NativeCallableattribute debe ser estrictamente System.Runtime.InteropServices para que funcione de forma correcta, entonces en VB.NET podrías tener problemas, ya que a diferencia de C#, los miembros añadidos se representarían en un espacio de nombres local, diferente a Global.System.Runtime.InteropServices pero con el mismo nombre. Así que al final quizás VB.NET no te sirva para hacer eso, aunque no estoy seguro, solo es una suposición, pero de todas formas si tienes problemas siempre puedes hacerlo en C#.

Saludos.