.Net Core 控制台程序读取appsettings.json

安装 nuget 包 Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.FileExtensionsMicrosoft.Extensions.Configuration.Json
在main方法中执行如下代码

var conf = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
var value = conf.GetSection("key").Value;

为.net core网站添加通用的操作引导指南(IntroJs)

接上级领导命令, 需要为开发的网站添加一个操作引导功能,让用户进入网站后可以大概了解如何操作.

实现该功能使用intro.js插件及asp.net core中组件(由于.net core中 @html.renderaction已经移除)来完成.

点击下载introjs

一. 首先是创建components

1. 在views/shared/components(没有请新建)目录下创建”IntroJs”目录

2. 创建ViewModel实体类

    public class IntroJsViewModel
    {
        /// <summary>
        /// 区域名
        /// </summary>
        public string Area { get; set; }

        /// <summary>
        /// 控制器名
        /// </summary>
        public string Controller { get; set; }

        /// <summary>
        /// 页面名
        /// </summary>
        public string Action { get; set; }

        /// <summary>
        /// 步骤列表
        /// </summary>
        public IntroStep[] Steps { get; set; }
    }

    public class IntroStep
    {
        /// <summary>
        /// 唯一选择器
        /// </summary>
        public string Element { get; set; }

        /// <summary>
        /// 步骤序号 1 ,2 ,3 ,4
        /// </summary>
        public int Step { get; set; }

        /// <summary>
        /// 提示文本, 可以为html
        /// </summary>
        public string Intro { get; set; }

        /// <summary>
        /// 位置, left right top  可为空
        /// </summary>
        public string Position { get; set; }
    }

3. 创建ViewComponent类

    public class IntroJsViewComponent: ViewComponent
    {
        public IntroJsViewComponent()
        {

        }

        public IViewComponentResult Invoke()
        {
            var routes = RouteData.Routers[0];
            var area = RouteData.Values["Area"] as string;
            area = string.IsNullOrWhiteSpace(area) ? "" : area.ToLower();
            var controller = RouteData.Values["Controller"].ToString().ToLower();
            var action = RouteData.Values["Action"].ToString().ToLower();
            StringBuilder sb = new StringBuilder();
            string line = string.Empty;
            string filepath = System.IO.Directory.GetCurrentDirectory() + "/IntroSettings.json";
            if (File.Exists(filepath))
            {
                using (StreamReader sr = new StreamReader(filepath))
                {
                    while ((line = sr.ReadLine()) != null)
                    {
                        sb.Append(line);
                    }
                }
                var stepList = JsonConvert.DeserializeObject<List<IntroJsViewModel>>(sb.ToString());
                var step = stepList.FirstOrDefault(x =>
                    x.Area.ToLower() == area && x.Controller.ToLower() == controller && x.Action.ToLower() == action);
                step = step == null ? new IntroJsViewModel{ Steps = new IntroStep[0]}: step;
                return View(step);
            }
            return View(new IntroJsViewModel { Steps = new IntroStep[0] });
        }
    }

4. 添加默认的Default.cshtml视图文件

文件代码如下:

@using WebProject.Views.Shared.Components.IntroJs
@model IntroJsViewModel
@{

}
<script type="text/javascript" src="~/Scripts/introjs/intro.min.js"></script>
<script>
    var showIntro = true;
    var steps = [];
    $(function () {

        @{
            foreach (var item in Model.Steps)
            {
                <text>steps.push({ element: '@item.Element', intro: '@item.Intro', position: '@item.Position' });</text>
            }
        }
        if (showIntro) {
            introJs().setOptions({
                prevLabel: "上一步",
                nextLabel: "下一步",
                skipLabel: "跳过",
                doneLabel: "完成",
                showProgress: true, //显示进度条
                steps:steps
            }).start();
        }
    });

</script>

二. 在需要添加引导的页面引用该组件

一般在母版页底部进行引用.

@await Component.InvokeAsync("IntroJs")

三. 添加配置文件

在项目根目录添加”IntroSettings.json”配置文件

area和controller及action用来确定页面(可以多个)

steps节点下的element为该页面下的dom选择器,如ID等, 请务必保证唯一,否则将影响效果

step为该提示的步骤, 从数字1开始

intro为引导的文字说明

position为文字说明在该dom元素的哪个方向. left,right,top, bottom

[
  {
    "Area": "FormStat",
    "Controller": "WKEntryYear",
    "Action": "Index",
    "Steps": [
      {
        "Element": "#divContent",
        "Step": 1,
        "Intro": "这里是头部......",
        "Position": ""
      },
      {
        "Element": "#btnSearch",
        "Step": 2,
        "Intro": "搜索内容 ",
        "Position": ""
      }
    ]
  }
]

 

五. 效果图

c# asp.net ip黑名单

短信验证码接口被恶意请求,写了一个简单的黑名单规则.
使用静态数组的形式实现,优点为不占用数据库资源且速度更快效率更高. 缺点为数据无持久化,网站重启后黑名单就清空了.
效果为: 如果指定时间内请求次数大于最大请求数并且发送的手机号码大于等于指定号码数量,则加入黑名单,时长为 {BlockTime}
根据如下属性进行配置后,
IsInBlackList方法为判断IP是否在黑名单内,返回bool
RecordRequest方法记录IP和手机号(可以根据功能自己修改具体功能),如满足列入黑名单条件,则自动列入黑名单, 返回bool. 如满足拉黑规则,则返回true,否则返回false

    public class IpBlock
    {

        /// <summary>
        /// 统计时间单位(秒)
        /// </summary>
        private const int Seconds = 60*50;//50分钟

        /// <summary>
        /// 单位时间内请求超出指定次数,则加入黑名单
        /// </summary>
        private const int RequestCount = 3;

        /// <summary>
        /// 单位时间内请求的手机号码数
        /// </summary>
        private const int RequestPhoneCount = 3;
        /// <summary>
        /// 黑名单时间 分钟
        /// </summary>
        private const int BlockTime = 60*24*7; //7天

        /// <summary>
        /// IP黑名单
        /// </summary>
        private static List<BlockedIp> BlackList;

        /// <summary>
        /// 请求详情
        /// </summary>
        private static List<IpRequestModel> RequestList;

        static IpBlock()
        {
            BlackList = new List<BlockedIp>();
            RequestList = new List<IpRequestModel>();
        }


        /// <summary>
        /// IP地址是否在黑名单中
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public static bool IsInBlackList(string ip)
        {
            UpdateBlackList();
            return BlackList.FirstOrDefault(x => x.Ip.Equals(ip)) != null;
        }

        /// <summary>
        /// 记录请求信息并将符合的IP列入黑名单
        /// </summary>
        /// <param name="ip"></param>
        public static bool RecordRequest(string ip, string phone)
        {
            UpdateRequestList();
            RequestList.Add(new IpRequestModel
            {
                Ip = ip,
                RequestTime = DateTime.Now,
                Phone = phone
            });
            var requestRecord = RequestList.Where(x => x.Ip.Equals(ip));
            var count = requestRecord.Count();
            var phoneCount = requestRecord.Select(x => x.Phone).Distinct().Count();
            if (count >= RequestCount && phoneCount >= RequestPhoneCount)
            {
                AddToBlackList(ip);
                return true;
            }
            return false;
        }





        /// <summary>
        /// 更新黑名单
        /// </summary>
        private static void UpdateBlackList()
        {
            var expireList = BlackList.Where(x => x.ExpireTime < DateTime.Now).ToList();
            foreach (var item in expireList)
            {
                BlackList.Remove(item);
            }
        }

        /// <summary>
        /// 将IP列入黑名单
        /// </summary>
        /// <param name="ip"></param>
        private static void AddToBlackList(string ip)
        {
            var item = BlackList.FirstOrDefault(x => x.Ip.Equals(ip));
            if (item != null)
            {
                item.ExpireTime = DateTime.Now.AddMinutes(BlockTime);
            }
            else
            {
                BlackList.Add(new BlockedIp
                {
                    ExpireTime = DateTime.Now.AddMinutes(BlockTime),
                    Ip = ip
                });
            }
        }


        /// <summary>
        /// 更新请求信息
        /// </summary>
        private static void UpdateRequestList()
        {
            var expireList = RequestList.Where(x => x.RequestTime < DateTime.Now.AddSeconds(0-Seconds)).ToList();
            foreach (var item in expireList)
            {
                RequestList.Remove(item);
            }

        }

    }

    public class BlockedIp
    {
        /// <summary>
        /// IP地址
        /// </summary>
        public string Ip { get; set; }

        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime ExpireTime { get; set; }
    }

    public class IpRequestModel
    {
        /// <summary>
        /// IP地址
        /// </summary>
        public string Ip { get; set; }

        /// <summary>
        /// 请求时间
        /// </summary>
        public DateTime RequestTime { get; set; }

        /// <summary>
        /// 手机号
        /// </summary>
        public string Phone { get; set; }

    }

效果:

......
2018-08-31 10:47:51.007 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 10:47:51 IP地址:223.68.67.198 手机号码:177****8475
2018-08-31 10:50:55.412 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:50:55 IP地址:220.190.28.133
2018-08-31 10:50:58.302 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:50:58 IP地址:60.181.172.196
2018-08-31 10:51:00.474 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:00 IP地址:39.171.235.161
2018-08-31 10:51:14.037 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:14 IP地址:60.181.164.123
2018-08-31 10:51:15.677 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:15 IP地址:182.200.0.14
2018-08-31 10:51:21.037 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:21 IP地址:112.12.136.83
2018-08-31 10:51:23.724 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:23 IP地址:42.234.41.134
2018-08-31 10:51:25.802 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:25 IP地址:60.180.34.139
2018-08-31 10:51:28.443 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:28 IP地址:182.200.179.203
2018-08-31 10:51:31.130 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:31 IP地址:115.223.150.237
2018-08-31 10:51:39.990 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:39 IP地址:113.87.130.72
2018-08-31 10:51:46.771 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:46 IP地址:113.247.23.88
2018-08-31 10:51:47.990 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:47 IP地址:60.180.50.65
2018-08-31 10:51:52.459 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:52 IP地址:182.200.7.6
2018-08-31 10:51:57.506 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:51:57 IP地址:115.223.135.93
2018-08-31 10:52:07.008 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:07 IP地址:223.68.67.198
2018-08-31 10:52:08.758 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:08 IP地址:60.180.235.58
2018-08-31 10:52:28.555 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:28 IP地址:27.18.202.136
2018-08-31 10:52:59.367 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:52:59 IP地址:113.139.240.243
2018-08-31 10:55:06.790 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 10:55:06 IP地址:125.47.67.224 手机号码:130****1322
2018-08-31 10:55:34.775 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:55:34 IP地址:59.109.117.88
2018-08-31 10:57:40.229 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 10:57:40 IP地址:180.120.160.12
2018-08-31 11:02:21.105 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:02:21 IP地址:113.139.242.216
2018-08-31 11:14:03.632 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 11:14:03 IP地址:1.194.21.226 手机号码:130****2793
2018-08-31 11:27:52.295 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:27:52 IP地址:27.17.148.80
2018-08-31 11:31:31.718 INFO ASP.mobilergister_aspx: 发送验证码短信 时间:2018/8/31 11:31:31 IP地址:125.47.55.70 手机号码:130****1323
2018-08-31 11:31:40.968 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:31:40 IP地址:182.200.3.11
2018-08-31 11:31:45.843 INFO ASP.mobilergister_aspx: IP加入黑名单 时间:2018/8/31 11:31:45 IP地址:125.47.55.70
......

C# 静态构造函数实现单例

使用静态构造函数只执行一次的特性,创建单例

public class SingletonClass
{
    private SingletonClass()=> Thread.Sleep(1000);
    static SingletonClass()=> _instance = new SingletonClass();
    private static readonly SingletonClass _instance;
    public static SingletonClass GetInstance()=> _instance;
}

dnc(.Net core/Dot Net Core) 中使用automapper

最近在学习架构方面的知识,顺便先写一个基于dnc(.Net core/Dot Net Core)的单体架构.有用到Automapper,先记录一下
一.安装Nuget包:
1. AutoMapper
2. AutoMapper.Extensions.Microsoft.DependencyInjection
二.创建AutoMapper的profile类

public class MyProfile:Profile
{
    public MyProfile()
    {
        CreateMap<SysUser, SysUserDTO>();
        CreateMap<Advance, AdvanceDTO>();
    }
}

三.StartUp类中配置Automapper
1.如果使用单个profile类,在ConfigureServices方法中加入:

services.AddAutoMapper(config =>
{
    config.AddProfile<MyProfile>();
});

2.如果使用多个profile类或者profile在不同的项目中,则加入如下:

services.AddAutoMapper(config =>
{
    var types = Assembly
                    .GetEntryAssembly()
                    .GetReferencedAssemblies()
                    .Select(Assembly.Load)
                    .SelectMany(y => y.DefinedTypes)
                    .Where(type => typeof(Profile).GetTypeInfo().IsAssignableFrom(type.AsType())
                    && type.FullName.ToUpper().StartsWith("CHCMS")
                    && type.BaseType.Equals(typeof(Profile)));//CHCMS是我的项目命名空间开头部分,请修改为你项目的对应命名空间开头部分.
    var typeList = new List<Type>();
    foreach (var ti in types)
    {
        var type = ti.AsType();
        typeList.Add(type);
    }
    config.AddProfiles(typeList);
});

四.开始使用

var user = _dbContext.SysUser.Where(x => x.UserName.Equals(userName)).FirstOrDefault();
var userDto = Mapper.Map<SysUserDTO>(user);

.net coe 类库中使用ef core遇到的问题

1.提示”dotnet-ef未知命令”:
在csproj文件中新增itemgroup,加入如下:

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />

2.dotnet ef migrations add xxx 时提示如下信息
The specified framework version ‘2.0’ could not be parsed
The specified framework ‘Microsoft.NETCore.App’, version ‘2.0’ was not found.
– Check application dependencies and target a framework version installed at:
\
– Alternatively, install the framework version ‘2.0’.
此信息的错误原因为未指定runtime版本号. 在 节点下加入如下:

<RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion>

版本号试项目而定
3. dotnet ef migrations add xxx时提示如下错误:
Unable to create an object of type ‘xxxDbContext’. Add an implementation of ‘IDesignTimeDbContextFactory‘ to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.
此错误为,没有找到dbcontext的初始化信息,未指定所用数据库以及数据库链接字符串.
解决此问题需要在项目中 dbcontext同目录下增加 IDesignTimeDbContextFactory 接口的实现类

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<CHCmsDbContext>

    {
       

        public CHCmsDbContext CreateDbContext(string[] args)

        {

            var builder = new DbContextOptionsBuilder<CHCmsDbContext>();
           
            builder.UseMySql("Server=localhost;User=chcms;Password=123456;DataBase=CHCms;");

            return new CHCmsDbContext(builder.Options);

        }

    }

Sqlserver for Linux(在CentOS中安装Sqlserver2017正式版)

若要在 RHEL 上配置 SQL Server,在安装的终端运行以下命令mssql server包:

重要

如果你已经安装 CTP 或 RC 版本的 SQL Server 自 2017 年,必须注册一个 GA 存储库之前先删除旧的存储库。?有关详细信息,请参阅从预览存储库的存储库更改到 GA 存储库

  1. 下载 Microsoft SQL Server Red Hat 存储库配置文件:

 

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo

备注

这是累积更新 (CU) 存储库。?有关你的存储库选项和它们之间的差异的详细信息,请参阅更改源存储库

  1. 运行以下命令,安装 SQL Server:
sudo yum install -y mssql-server
  1. 软件包安装完成后,运行mssql conf 安装命令并按照操作提示设置 SA 密码,并选择你的版本。
sudo /opt/mssql/bin/mssql-conf setup

提示

如果你在本教程中尝试 SQL Server 自 2017 年,自由地授予许可的以下版本: 评估、 开发人员和快速。

备注

请确保为 SA 帐户指定强密码(最少 8 个字符,包括大写和小写字母、十进制数字和/或非字母数字符号)。

  1. 配置完成后,请验证服务是否正在运行:
systemctl status mssql-server
  1. 若要允许远程连接,请在 RHEL 上打开防火墙上的 SQL Server 端口。默认的 SQL Server 端口为 TCP 1433。?如果你使用FirewallD适合您的防火墙,你可以使用以下命令:
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload

如果上边提示firewall-cmd未知命令, 那就用下面的

iptables -A INPUT -p tcp -m multiport --dports 1433 -j ACCEPT
service iptables save;service iptables restart

此时,SQL Server 正在您 RHEL 的计算机上运行并且已准备好使用 !

安装 SQL Server 命令行工具

若要创建数据库,你需要使用一种工具,可以在 SQL Server 上运行 TRANSACT-SQL 语句进行连接。?以下是 SQL Server 命令行工具:?sqlcmdbcp

  1. 下载 Microsoft Red Hat 存储库配置文件。
sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo
  1. 如果你有以前版本的mssql 工具安装,请删除任何较旧的 unixODBC 程序包。
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
  1. 运行以下命令以安装mssql 工具与 unixODBC 开发人员包。
sudo yum install -y mssql-tools unixODBC-devel
  1. 为方便起见,添加/opt/mssql-tools/bin/到你的PATH境变量。这使您可以运行工具,而无需指定完整路径。?在登录会话和交互式/非登录会话中运行以下命令以修改PATH
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

提示

Sqlcmd只是一个用于连接到 SQL Server 并运行查询和执行管理及开发任务的工具。?其他工具包括SQL Server Management StudioVisual Studio Code

本地连接

以下步骤使用 sqlcmd 本地连接到新的 SQL Server 实例。

  1. 使用 SQL Server 名称 (-S),用户名 (-U) 和密码 (-P) 的参数运行 sqlcmd。在本教程中,用户进行本地连接,因此服务器名称为?localhost。?用户名为?SA,密码是在安装过程中为 SA 帐户提供的密码。
sqlcmd -S localhost -U SA -P 'YourPassword'

提示

可以在命令行上省略密码,以收到密码输入提示。

提示

如果以后决定进行远程连接,请指定 -S 参数的计算机名称或 IP 地址,并确保防火墙上的端口 1433 已打开。

  1. 如果成功,应会显示 sqlcmd 命令提示符:1>。
  2. 如果连接失败,请首先尝试根据错误消息诊断问题。然后查看连接故障排除建议

创建和查询数据

下面各部分将逐步介绍如何使用 sqlcmd 新建数据库、添加数据并运行简单查询。

新建数据库

以下步骤创建一个名为?TestDB?的新数据库。

  1. 在 sqlcmd 命令提示符中,粘贴以下 Transact-SQL 命令以创建测试数据库:
CREATE DATABASE TestDB
  1. 在下一行中,编写一个查询以返回服务器上所有数据库的名称:
SELECT Name from sys.Databases
  1. 前两个命令没有立即执行。必须在新行中键入?GO?才能执行以前的命令:
GO

插入数据

接下来创建一个新表?Inventory,然后插入两个新行。

  1. 在 sqlcmd 命令提示符中,将上下文切换到新的TestDB?数据库:
USE TestDB
  1. 创建名为Inventory?的新表:
CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
  1. 将数据插入新表:
INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
  1. 要执行上述命令的类型GO:
GO

选择数据

现在,运行查询以从?Inventory?表返回数据。

  1. 通过 sqlcmd 命令提示符输入查询,以返回Inventory?表中数量大于 152 的行:
SELECT * FROM Inventory WHERE quantity = 152;
  1. 执行命令:
GO

退出 sqlcmd 命令提示符

要结束 sqlcmd 会话,请键入?QUIT:

QUIT

从 Windows 进行连接

Windows 上的 SQL Server 工具连接到 Linux 上的 SQL Server 实例,操作方式与连接到任何远程 SQL Server 实例一样。

如果有一台可以连接到 Linux 计算机的 Windows 计算机,请从运行 sqlcmd 的 Windows 命令提示符尝试执行本主题中的相同步骤。?仅验证所使用的是目标 Linux 计算机名称或 IP 地址,而非 localhost,并确保 TCP 端口 1433 已打开。?如果从 Windows 进行连接存在任何问题,请参阅连接故障排除建议

有关在 Windows 上运行,但连接到 Linux 上的 SQL Server 的其他工具,请参阅:

后续步骤

有关其他安装方案,请参阅以下资源:

升级 了解如何升级 Linux 版 SQL Server 的现有安装
卸载 在 Linux 上卸载 SQL Server
无人参与安装 了解如何编写无提示安装脚本
脱机安装 了解如何手动下载脱机安装程序包

若要了解连接和管理 SQL Server 的其他方法,请参阅?Visual Studio Code?和?SQL Server Management Studio

若要详细了解如何编写 Transact-SQL 语句和查询,请参阅教程:编写 Transact-SQL 语句

 

Xamarin调用百度SDK实现百度定位

Xamarin集成各方面第三方jar过程中都会有意想不到的各种问题,这里特地说明如何集成百度地图 ,希望可以帮到更多的初学者。

废话不多说,进入主题:

第一步(下载相关SDK):

  首先下载百度地图所需的SDK包,我这里是使用的v4.2,下载后会有一个文件夹,两个jar文件。首先我们需要的就是想办法将两个jar包转换为dll

第二步(转换jar包为dll):

    1、新建 Java Bindings Library 项目

    2.将 android-support-v4.jar , BaiduLBS_Android.jar 放到Jars文件夹下

    3.修改.jar其属性

      android-support-v4.jar转换属性设为:EmbeddedReferenceJar

BaiduLBS_Android.jar转换属性设为:EmbeddedJar

    5.生成项目,生成成功

到该项目的bin\Debug目录下拿到dll,得到了生成的dll,接下来就是我们说了算了,直接在项目中引用生成的dll,最好单独引用dll,不要引用项目,会有问题。

第三步:进行引用,实现定位

  1、新建App项目

  新建好项目后第一件事儿就是引用刚刚生成的dll。

  2、向AndroidManifest.xml 配置相关权限、f服务声明,ak秘钥信息
    打开AndroidManifest.xml文件:
    

   I.在根节点中加入以下权限:
     

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
      </uses-permission>
       <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.READ_PHONE_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
        </uses-permission>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
        </uses-permission>
        <uses-permission android:name="android.permission.READ_LOGS" >
        </uses-permission>
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        
      <service
               android:name="com.baidu.location.f"
               android:enabled="true"
               android:process=":remote" >
                <intent-filter>
                    <action android:name="com.baidu.location.service_v2.2" >
                    </action>
                </intent-filter>
        </service>

    III.加入ak秘钥信息,一样的在在节点中声明:
      
      

  3:在项目中新建libs文件夹,将下载的SDK包中的armeabi文件夹拷贝到该目录下
    
  4:将armeabi目录下的so文件的生成操作为AndroidNativeLibrary。

  5:最后一步,就是转换相关Demo里面的代码了,这个应该不需要多说了吧!定位的话转换以下两个.java文件即可。

6.运行,记住,要真机调试,AVD是定位不了的。运行结果如下:

    这样,就实现了Xamarin Android集成百度定位的相关操作了。自己开始也折腾了半天,烦躁死,总算功夫不负有心人,终于搞出来了,以防有其他朋友也需要实现该功能(我开始是使用的Android自带的定位服务,但总归是定位慢,还只有在比较开阔的地方才能正常点拿到位置信息),少走冤枉路,减少不必要的麻烦,特写出实现方法,如有什么问题,还请大家多多指教,多谢!!!

原文地址:http://www.cnblogs.com/lts-lts/p/4907967.html