VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3061|回复: 14

急!在线等。关于在C#中调用非托管.exe程序的问题?

[复制链接]

1

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-21 09:00:01 | 显示全部楼层 |阅读模式
在c++中开发的应用程序(目前也在vs中开发)的.exe程序,在c#环境中使用DllImport引用进来,出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”错误。 希望各位高手解决一下。
C++:
EXTERN_C int _declspec(dllexport) GetInt()
{
       
        CFile f("C:\\t.txt",CFile::modeReadWrite);//加上这句就出错,如果注销,程序可以顺利执行,文件路径没问题。

        return 222;
}

c#:
[DllImport("DrawSystem1.exe", EntryPoint = "_GetInt@0", CharSet = CharSet.Auto)]
        public static extern int GetInt();

谢谢各位高手,必须在今天解决这个问题。已经好几天了,如果解决不了要耽误进程了。
回复

使用道具 举报

0

主题

119

帖子

67.00

积分

新手上路

Rank: 1

积分
67.00
发表于 2020-4-30 12:00:01 | 显示全部楼层
当前用户对t.txt有没有权限?
回复

使用道具 举报

0

主题

52

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-4-30 13:00:01 | 显示全部楼层
检查该文件的属性是否正确
回复

使用道具 举报

1

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-4-30 20:30:01 | 显示全部楼层
问题好像不是处在文件上。
我用下面这个做测试也是不好用。
EXTERN_C int _declspec(dllexport) GetInt()
{
       
        //CFile f("C:\\t.txt",CFile::modeReadWrite);
        MessageBox(0,"TTTTT","CCCCC",0);

        return 222;
}

还请各位帮忙分析一下
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-5-1 20:15:02 | 显示全部楼层
为什么用EXE里的方法?用DLL不好么?
回复

使用道具 举报

1

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-5-2 19:30:01 | 显示全部楼层
可以,但是效果都是一样的!
我也是刚接触这个东西,郁闷中。还希望各位高手帮帮忙!
回复

使用道具 举报

0

主题

10

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-5-6 09:45:01 | 显示全部楼层
把c++函数调用方式改成stdcall试试(猜的)
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-5-7 09:30:02 | 显示全部楼层
我也有同样问题,我的C++ dll 头文件如下:
namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        // Returns a + b
        static __declspec(dllexport) double Add(double a, double b);
        
            // Returns a - b
        static __declspec(dllexport) double Subtract(double a, double b);

        // Returns a * b
        static __declspec(dllexport) double Multiply(double a, double b);

        // Returns a / b
        // Throws DivideByZeroException if b is 0
        static __declspec(dllexport) double Divide(double a, double b);
    };
}
然后在C++里面可以调用,但在C#里面就遇到问题。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace MyCSharpExecRefsDll
{
    class Program
    {
        static void Main(string[] args)
        {
            myWin32 mywin32 = new myWin32();
            Console.WriteLine(myWin32.Add(3, 4));

        }
            public class myWin32
        {
            [DllImport("MathFuncsDll1.dll")]
            public static extern double Add(double a, double b);
            [DllImport("MathFuncsDll1.dll")]
            public static extern double Subtract(double a, double b);
            [DllImport("MathFuncsDll1.dll")]
            public static extern double Multiply(double a, double b);
            [DllImport("MathFuncsDll1.dll")]
            public static extern double Divide(double a, double b);

        }

    }
}
调用的时候总是说没有这个入口。
Unable to find entry point named "Add" in DLL "MathFuncDll1.dll"
回复

使用道具 举报

1

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-5-7 22:00:01 | 显示全部楼层
写成下面这个样子,就找不到程序的入口点了。
EXTERN_C void __stdcall GetInt()
{
       
        //CFile f("C:\\t.txt",CFile::modeReadWrite);
        MessageBox(0,"TTTTT","CCCCC",0);

        //return 222;
}
回复

使用道具 举报

1

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-5-8 08:45:01 | 显示全部楼层
TO:freegreat
你把方法写到类的外面,应该就可以了。然后你用depends打开你编辑的dll文件,在里面你可以查看入口函数名。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表