[Plugin] .NET Plugin - Write PLUGINS in C#
#1

So. This is a experimental project that allows you to write plugins at C#.


The functions on the server side:
callDotnetMethod - it calls the C# method
Code:
Parameter's:
methodName - name of the method split[] - key for parameters
i - int32 f - float s - string c - char
{Float,_}:... - arguments
Return's:
int32, boolean, float
Quote:

Due to the fact that AMX can not return a text value, it was necessary to create an alternative function based on the previous

callDotnetMethodStr - An alternative to the previous function, but it records the text in variable
Code:
Parameter's:
methodName - name of the method split[] - key for parameters
i - int32 f - float s - string c - char
str[] - array for string length - array length {Float,_}:... - arguments
Always returns 1!
The functions on the plugin side:
cpp.callRemoteCallback - It calls a function by name and passes parameters.
Code:
Parameter's:
string callback - callback name params object[] args - arguments
cpp.logwrite - write message to console
An example of using these functions

Pawn:
PHP Code:
#include <a_samp>
native callDotnetMethod(methodName[], split[], {Float,_}:...);
native callDotnetMethodStr(methodName[], str[], lensplit[], {Float,_}:...);
main(){
}
public 
OnGameModeInit() {
    
callDotnetMethod("onDotnetLoaded""cf"'v'1.0);
    new 
temp_int callDotnetMethod("kernel.testINT""ii"1024);
    
printf("testINT returned: %i"temp_int);
    
    new 
temp_bool callDotnetMethod("kernel.testBOOL""isi"1"boolean=)"0);
    
printf("testBOOL returned: %i"temp_bool);
    
    new 
temp_float callDotnetMethod("kernel.testFLOAT""ifcf"101.432'c'242);
    
printf("testFLOAT returned: %f"temp_float);
    
    new 
temp_str16 ] ;
    
callDotnetMethodStr("kernel.testSTRING"temp_strsizeof temp_str"sss""by""Seregamil""dotNET v1.0");
    
printf("testSTRING returned: %s"temp_str);
    return 
true ;
}
forward onDotnetWasLoaded(str[]);
public 
onDotnetWasLoaded(str[]){
    print(
str);

C#:
PHP Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace 
c_sharp
{
    public class 
kernel
    
{
        public static 
object onDotnetLoaded(params object[] args)
        {
            
cpp.logwrite("dotnet-> onDotnetLoaded was called. ARGS:");
            foreach (
object arg in args)
            {
                
cpp.logwrite(arg.ToString());
            }
            
cpp.callRemoteCallback("onDotnetWasLoaded""Hello! =)");
            return 
true;
        }
        public static 
object testINT(params object[] args)
        {
            
cpp.logwrite("dotnet-> testINT was called");
            
int a Convert.ToInt32(args[0]);
            
int b Convert.ToInt32(args[1]);
            return 
;
        }
        public static 
object testBOOL(params object[] args)
        {
            
cpp.logwrite("dotnet-> testBOOL was called.");
            return 
false;
        }
        public static 
object testSTRING(params object[] args)
        {
            
cpp.logwrite("dotnet-> testSTRING was called." );
            foreach (
object arg in args)
            {
                
cpp.logwrite(string.Format("{0}: {1}",arg.GetType(), arg.ToString()));
            }
            return 
"blackJack prod.";
        }
        public static 
object testFLOAT(params object[] args)
        {
            
cpp.logwrite("dotnet-> testFLOAT was called. ARGS:");
            
float result 13.228f;
            return 
result;
        }
    }

Result:


The solution contains 2 project. First at C #, the second at C ++. It's a COM assembly.
When compiling formed a * .dll file in the right directory. In my case it S:\gta-o\plugins\.
I'm using VS 2012 Express.

ATTENTION. COMPILATION OF PROJECT MADE IN ADMINISTATOR MODE

I have not tested the project in a Linux environment.

Link to project with examples: https://github.com/Seregamil/.NET-plugin
Reply
#2

Added class for working with regular expressions

regex.IsMatch - Indicates whether the regular expression specified in the Regex constructor finds a match in the specified input string, beginning at the specified starting position in the string.
regex.Match - Searches the specified input string for the first occurrence of the specified regular expression.
regex.Replace -

In a specified input string, replaces all strings that match a regular expression pattern with a specified replacement string.

The names of the functions are taken from here ( https://sampforum.blast.hk/showthread.php?tid=247893 )

macro:
PHP Code:
#define regex_match(%0,%1) callDotnetMethod("regex.Match", "ss", %0, %1)
#define regex_is_match(%0,%1) callDotnetMethod("regex.IsMatch", "ss", %0, %1)
#define regex_replace(%0,%1,%2) callDotnetMethodStr("regex.Replace", %0, sizeof(%0), "sss", %0, %1, %2) 
class regex: https://github.com/Seregamil/.NET-pl...sharp/regex.cs
example script: https://github.com/Seregamil/.NET-pl...egex/regex.pwn
Reply
#3

Nice.. Could be useful to make a c# backend and a pawn frontend.
Reply
#4

This could be great!
Reply
#5

Is this allows us to use multithread?
Reply
#6

Quote:
Originally Posted by erorcun
View Post
Is this allows us to use multithread?
Theoretically - yes.
In practice - I have not yet experienced.

In the evening I try to run the multi-threading.
Reply
#7

I actually think this might be useful pat yourself on the back young pawadan +rep.
Reply
#8

Well... I know what it is and I can see why it's useful but could someone explain me, how is it different from creating a plugin in C++ and calling the natives in PAWN?
Reply
#9

Good Job,Keep it Up !
Reply
#10

Quote:
Originally Posted by kvann
View Post
Well... I know what it is and I can see why it's useful but could someone explain me, how is it different from creating a plugin in C++ and calling the natives in PAWN?
Sometimes it's too much work to compile an entire plugin just for something simple. Some people don't even know C++. Some people don't even know how to make a SA-MP plugin. Sometimes C# can do a job easier than C++. Sometimes C++ can't do something C# can (and vice-versa). And many more...
Reply
#11

Well I was going to use it to test some things, then came across a lot of problems.

One obviously being I had to change the "S:\gta-o\plugins" path in the source and in the project files. Another being we don't have the assembly key for something. Another path needing to be changed in the project files for the c_sharp.tlb.

Basically you should make the source more distributable. You should also give us a step by step instruction on building it.

There a lot of people with even less of an idea of how to solve this stuff than I do, so obviously it need to be more lenient.

I give up for now...

EDIT: And lastly, it's not working on WinXP. Yes I have the 120_xp toolset set.
EDIT: Working on XP after some vs2012 to vs2010 adjustments and casts...
Reply
#12

Quote:

Another being we don't have the assembly key for something.

https://github.com/Seregamil/.NET-pl...source/key.snk - this?
Quote:

Basically you should make the source more distributable. You should also give us a step by step instruction on building it.

I'm working on it.
I completely rewrite project.
Reply
#13

Quote:
Originally Posted by Seregamil1
View Post
I'm working on it.
I completely rewrite project.
Ah sweet! I was writing random plugins like all day yesterday.

When you rewrite it could you add some AMX functions to the native side? Like the ability to execute natives.
Reply
#14

Quote:
Originally Posted by Crayder
View Post
Ah sweet! I was writing random plugins like all day yesterday.

When you rewrite it could you add some AMX functions to the native side? Like the ability to execute natives.
I'll try to add, but I do not promise.
Reply
#15

Quote:
Originally Posted by Seregamil1
View Post
I'll try to add, but I do not promise.
Ok, great. One last thing, can you try to retain WinXP support? No matter what way I compile this, whether it be on my WinXP OS in VS2010 or on my Win7 machine with the XP toolset. I even tried including all the libraries in the dll itself with the "Code Generation/Runtime Library" setting. NOTHING works!
Reply
#16

It's working on linux?
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)