【问题标题】:Export unmanaged C# DLL (with namespace) for MT4为 MT4 导出非托管 C# DLL(带有命名空间)
【发布时间】:2016-09-15 06:59:29
【问题描述】:

我在 C# 中有一个代码,该代码应导出为未转换的代码,因为它将被 MetaTrader 终端 4 使用作为#import-ed 库(.dll)。

最大的问题是:

Q1 ) 我可以使用system.netsystem.net.mail 命名空间作为非托管DLL 导出吗?

Q2 ) 如果没有,有什么更好的解决方案(将 DLL 导出为非托管并引用命名空间)?

Q3 ) 为什么导出不适用于此功能(EnviarCorreo)?

谢谢。

using System;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Mail;
namespace Testme
{
    class Test
    {
        [DllExport("EnviarCorreo", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.LPWStr)]
        public static int EnviarCorreo(string ServidorSMTP, string usuario, string pass, bool HTML, string Asunto, string Cuerpo, string Desde, string Para)
    {
        MailMessage mail = new MailMessage();
        //direccion desde
        mail.From = new MailAddress("tester@domain.com", "Name");
        mail.ReplyTo = new MailAddress("info@domain.com");
        MailAddress toa = new MailAddress("admin@domain.com");

        string contenido = "Aquí vamos a escribir en HTML <br>Para ver</br>";
        mail.BodyEncoding = Encoding.Unicode;
        mail.SubjectEncoding = Encoding.Unicode;
        mail.To.Clear();
        mail.To.Add(toa);
        mail.Subject = "PRUEBA DE CORREO";
        mail.Body = contenido;// +Constants.vbCr + Constants.vbLf;
        mail.IsBodyHtml = true;
        SmtpClient smtp = new SmtpClient("mail.domain.com");
        smtp.Credentials = new NetworkCredential("tester@domain.com", "blabla");
        smtp.Send(mail);
        return 158;
    }

        [DllExport("Add", CallingConvention = CallingConvention.StdCall)]
        public static int Add(int left, int right)
        {
            return left + right;
        }

        [DllExport("Sub", CallingConvention = CallingConvention.StdCall)]
        public static int Sub(int left, int right)
        {
            return left - right;
        }

        [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)]
        public static double AddDouble(double left, double right)
        {
            return left + right;
        }

        [DllExport("AddFloat", CallingConvention = CallingConvention.StdCall)]
        public static float AddFloat(float left, float right)
        {
            return left + right;
        }

    }
}

【问题讨论】:

  • Export doesnt work 不是一个很好的解释。请详细说明。
  • 另外,你应该准确地指定你的DllExport 是什么。它不是标准的,它可能是this 或其他任何东西。
  • 1:是的。 2:不适用 3:您不知道,因为当 CLR 找不到您的 dll 或编组器因您的错误声明或方法引发异常时没有人捕获异常。您必须将调试器类型从自动更改为混合,这样您至少可以诊断出最基本的故障。并在您的代码中使用 try/catch-em-all 以便您可以返回错误代码。
  • 你好汉斯,关于“1:是”,你知道我该怎么做(导出为非托管 DLL 时链接命名空间)?你是对的,我正在添加 try-catch 以查看任何错误,因为此时我没有任何错误,这很奇怪,因为这不起作用。

标签: c# dll namespaces unmanaged metatrader4


【解决方案1】:

.Net 是一种托管语言,因此您不能只创建非托管 dll。它稍微复杂一些,因为您的 dll 取决于框架。有很多方法可以做到这一点,但它们需要一些工作。看看这篇文章的答案。

https://social.msdn.microsoft.com/Forums/en-US/afb244b3-1cd4-48b4-93ba-f019fdce6a8e/creating-an-unmanaged-dll-in-c?forum=csharplanguage

【讨论】:

  • 嗨,最大的问题是,如果我有框架中的命名空间,我可以将托管函数导出到非托管代码吗?你有其他提示吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 2017-03-07
  • 2013-08-17
  • 2015-09-18
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多