Я запускаю код go из приложения do tnet и возился с defer в go (я пытаюсь вызвать различные типы сбоев). У меня есть один случай, неверный доступ к памяти, когда pani c фактически вылетает из всего приложения do tnet (на Windows 10 не на Linux). Не могу понять, упускаю ли я что-то.
Примечание: если я принудительно использую «целочисленное деление на ноль» или «pani c ()», оно не треснет sh do tnet application.
Приведенные ниже примеры выполняются в Windows 10:
package main
import "C"
import "fmt"
type HelloFunc func(string)
//export Hello
func Hello() {
defer func() {
fmt.Println("defer start")
if r := recover(); r != nil {
fmt.Println("hello from the deferred function!")
}
fmt.Println("defer end")
}()
fmt.Println("Hello")
var hf HelloFunc
hf("world")
fmt.Println("don't print me")
}
func main() {
Hello()
}
Сборка DLL (кросс-компиляция в системе Linux)
env GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ go build -o test.dll -i -v -buildmode=c-shared test.go
using System;
using System.Runtime.InteropServices;
namespace native_lib
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("-->> 1");
try {
GoFunctions.Hello();
} catch (Exception e) {
Console.WriteLine($"-->> {e}");
} finally {
Console.WriteLine("-->> 2");
}
}
}
}
static class GoFunctions
{
[DllImport("./test.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern void Hello();
}
Вывод:
> dotnet run
-->> 1
Hello
> echo $?
False