2024年4月

轻松复现一张AI图片

现在有一个非常漂亮的AI图片,你是不是想知道他是怎么生成的?

今天我会交给大家三种方法,学会了,什么图都可以手到擒来了。

需要的软件

在本教程中,我们将使用AUTOMATIC6666661 stable diffusion WebUI。这是一款流行且免费的软件。您可以在Windows、Mac或Google Colab上使用这个软件。

方法1: 通过阅读PNG信息从图像中获取提示

如果AI图像是PNG格式,你可以尝试查看提示和其他设置信息是否写在了PNG元数据字段中。
首先,将图像保存到本地。
打开AUTOMATIC6666661 WebUI。导航到
PNG信息
页面。

image-20240409232941011
将图像拖放到左侧的

画布上。

上传了图像的PNG信息页面。
在右边你会找到关于提示词的有用信息。你还可以选择将提示和设置发送到txt2img、img2img、inpainting或者Extras页面进行放大。

方法2:使用CLIP interrogator从图像中推测Prompt

在处理图像信息时,我们常常会发现直接的方法并不总是有效。

有时候,信息并没有在最初就被记录在图像中,或者在后续的图像优化过程中被Web服务器去除。

也有可能这些信息并非由Stable diffusion这类AI技术生成。

面对这种情况,我们可以尝试使用CLIP interrogator作为替代方案。

CLIP interrogator是一种AI模型,它具备推测图像内容标题的能力。这个工具不仅适用于AI生成的图像,也能够应对各种类型的图像。通过这种方式,我们能够对图像内容进行更深入的理解和分析。

什么是CLIP?

CLIP(Contrastive Language–Image Pre-training)是一个神经网络,它将视觉概念映射到自然语言中。CLIP模型是通过大量的图像和图像信息对进行训练的。

image-20240409233700659

在我们的用例中,CLIP模型能够通过对给定图片的分析,推断出一个恰当的图片描述。

这个描述可以作为提示词,帮助我们进一步理解和描述图片的内容。CLIP模型通过学习大量的图像和相关文本数据,掌握了图像识别和语义理解的能力,因此它能够捕捉到图片中的关键元素,并将其转化为一个描述性的标题。

WebUI中自带的CLIP interrogator

如果你倾向于避免安装额外的扩展,可以选择使用AUTOMATIC6666661提供的内置CLIP interrogator功能。

WebUI提供了两种识别图像信息的功能。一个是clip:这个功能底层基于BLIP模型,它是在论文《BLIP: 为统一的视觉语言理解和生成进行语言图像预训练》中由李俊楠以及其团队所提出的CLIP模型的一个变种。一个是DeepBooru, 这个比较适合识别二次元图片。

要利用这个内置的CLIP interrogator,你可以按照以下简单的步骤操作:

  1. 启动AUTOMATIC6666661
    :首先,你需要打开AUTOMATIC6666661的网站。

  2. 导航至
    img2img
    页面:在AUTOMATIC6666661的界面中,找到并点击“img2img”这一选项。这是一个专门的页面,用于上传和处理图像。

  3. 上传图像到
    img2img
    画布:在这个页面上,你会找到一个用于上传图像的区域,通常被称为“画布”。点击上传按钮,选择你想要分析的图像文件,并将其上传到画布上。

  4. 上传之后在界面右边就可以找到两个interrogator工具了:

image-20240409235643665

点击这两个按钮,就可以获得图像的描述信息了。

我们可以得到下面的信息:

a woman in a blue top and pink skirt standing on a hill near the ocean with a grassy area in the background,Ai Xuan,ocean,a statue,rococo,

我们用这段提示发到text2image中看看效果:

image-20240410161245669

嗯....大体上还是有点相似的..... 因为图片跟我们的底模,种子还有采样多种因素有关。所以你想1比1复制,这个比较难。

CLIP扩展

如果您在使用AUTOMATIC6666661的内置CLIP interrogator时发现其功能不足以满足您的需求,或者您希望尝试使用不同的CLIP模型来获得更多样化的结果,那么您可以考虑安装CLIP interrogator扩展。这个扩展将为您提供更多的选项和灵活性,以适应您特定的使用场景。

这个插件的下载地址如下:

https://github.com/pharmapsychotic/clip-interrogator-ext

要使用CLIP interrogator扩展。

  1. 打开AUTOMATIC6666661 WebUI。

  2. 转到interrogator页面。

  3. 将图像上传到
    图像
    画布。


  4. CLIP模型
    下拉菜单中选择
    ViT-L-14-336/openai
    。这是Stable Diffusion v1.5中使用的语言嵌入模型。
    image-20240410000207328

  5. 单击
    生成
    以生成提示。

对SDXL模型进行CLIP

如果你的目标是使用Stable Diffusion XL (SDXL)模型,那么我们需要选择不同的CLIP模型。

在“interrogator”页面上,你可以选择很多clip模型,如果要和SDXL模型一起工作的话,那么可以选择
ViT-g-14/laion2b_s34b_b88k
这个选项。

选择
ViT-g-14/laion2b_s34b_b88k
模型后,系统将会根据这个模型的特性生成相应的提示。你可以使用这个提示词作为SDXL的提示,从而可以更精确地生成与原始图像内容相符合的图像。

ViT-g-14/laion2b_s34b_b88k模型是一个基于Vision Transformer (ViT)架构的预训练模型,它在大型图像数据集laion2b上进行了训练,具有34亿个参数。这个模型在图像识别和理解方面表现出色,能够有效地捕捉图像的关键特征,并生成与原始图像内容紧密相关的提示。

通过这种方式,就可以确保在使用SDXL模型进行图像生成时,所得到的输出图像能够更好地反映原始图像的意图和风格。

总结一下

我们讲了三种方法来从图片信息中提取出对应的Prompt。

你应该首先尝试使用PNG信息方法。这种方法的优势在于,如果图像中包含了完整的元数据,那么您可以一次性获取到包括提示、使用的模型、采样方法、采样步骤等在内的所有必要信息。这对于重新创建图像非常有帮助。

如果PNG没有信息可用,那么可以考虑使用BLIP和CLIP模型。对于v1.5模型来说,ViT-g-14/laion2b_s34b_b88k模型可能是一个不错的选择,它不仅适用于SDXL模型,也可能在v1.5模型中表现出色。

另外,我们在构建提示词的时候,不要害怕对提示词进行修改。因为自动生成的提示可能并不完全准确,或者可能遗漏了一些图像中的关键对象。

所以需要根据自己的观察和需求,来修改提示词以确保它能准确地描述图像内容。这对于最终生成的图像质量和准确性至关重要。

同时,选择正确的checkpoint模型也非常关键。因为提示中可能并不总是包含正确的风格信息。

例如,如果您的目标是生成一个真实人物图像,那么你肯定不能选择一个卡通模型。

点我查看更多精彩内容:www.flydean.com

目前,Kimi备受瞩目,不仅在社交平台上引起了广泛关注,而且在解决我们的实际问题方面也显示出了巨大潜力。其支持超长文本的特性使得我们能够更加灵活地配置信息,避免了频繁与向量数据库进行交互以及编写提示词来回答查询的繁琐过程。简而言之,Kimi的出现为我们提供了一种更为便捷和高效的信息获取方式。

今天,我们将探讨如何通过与Kimi对接来解决我在工作中遇到的一些挑战。其中包括利用双方的沟通记录来获取用户的情感信息,以及对我的沟通不足进行深入分析。

Kimi开放平台

我们将首先前往开发平台地址:
https://platform.moonshot.cn/docs/intro。

在这里,我们主要关注他们的计费方式以及API对接SDK。接着,我们会申请一个API密钥以便调用他们的接口。最后,我们将根据我们的需求编写一段具有实质性的提示词。根据这些步骤,我们将逐一详细解释并执行。

计费方式

在这一步,拥有一定财力的人当然会更有优势,这点毋庸置疑,但我不会深入讨论这个话题。值得一提的是,即使是个人用户,我们也可能享有一些免费的额度。因此,让我们开始利用这些资源,展开我们的操作吧,说干就干!

image

API对接

在官方文档对接地址:
https://platform.moonshot.cn/docs/api-reference

我们可以简单浏览一下。我之前已经对接过许多大型模型,因此可以直接跳过官方文档,转而使用他们提供的语言对接示例。官方提供的示例通常非常简单易懂。

考虑到需要将API集成到我的项目中,因此我会以Java为主。在Java示例中,由于这只是一个演示,所以它相对简单。为了避免领导批评,我们需要将不同的类分开存储,以保持代码结构的清晰和可维护性。
Java Demo

最终,我们期望实现的效果如下:

image

APIkey申请

接下来,我们需要进行一项关键步骤,即申请 API 密钥,以便进行接口调用。

你可以在以下地址完成申请:
https://platform.moonshot.cn/console/api-keys

当然,你也可以申请多个 API 密钥,但需要注意,免费用户只能最多保留5个密钥。

image

申请完毕后,请将所获得的 API 密钥保存到一个文件中,以备后续使用。

提示词

在这个阶段,我们来到了最关键的一步,请注意,之前我曾专门探讨过如何撰写出色的提示词,因此我将直接进入最终的提示词模板:

image

调用效果

我的文件中包含了许多不同的业务搜索,为了节省时间,我不会逐一向大家展示。然而,我将概述主要的流程,让大家对整体情况有个清晰的了解:

//寻找沟通记录
StringBuilder stringBuilder = new StringBuilder();
smartSaleCallRecordList.stream().forEach(item->{
    stringBuilder.append(item.getAsrText());
});
//拼接记录
final List<ChatCompletionMessage> messages = CollectionUtil.list(true,
        new ChatCompletionMessage(ChatMessageRole.SYSTEM.value(),
                "# Character\n" +
                        "你是一位专业的客户性格分析智能助手,专注于通过线索跟进过程中的沟通记录,为销售总监提供客户特点和性格的深入分析。你的目标是通过精准的性格分析,辅助销售团队更好地理解客户,从而提升销售效率和客户满意度。你的回复内容必须限定在200字-300字之间\n" +
                        "## Skills:\n" +
                        "- 能够深入分析客户的沟通记录,识别其性格特征、偏好和行为模式。\n" +
                        "- 根据客户的性格和需求,提供定制化的沟通策略和建议,帮助销售顾问和IDCC话务员优化跟进方式。\n" +
                        "- 利用先进的数据分析技术,从客户的反馈和互动中提取有价值的信息,为销售团队提供决策支持。\n" +
                        "- 能够根据客户的沟通历史,预测其可能的反应和行为,为销售团队制定更有效的销售策略。\n" +
                        "## Constraints:\n" +
                        "- 必须确保所有分析和建议均基于客户提供的信息和沟通记录,不得涉及任何未经授权的个人信息。\n" +
                        "- 应遵守相关法律法规和行业标准,确保客户隐私和数据安全。\n" +
                        "- 仅提供与客户性格分析和沟通技巧改进相关的建议,不涉及其他销售策略和市场营销活动。\n" +
                        "- 在提供分析和建议时,应保持客观和中立,避免任何形式的偏见和歧视。\n" +
                        "- 所有建议应以提升销售顾问和IDCC话务员的专业能力和服务质量为目标,不得包含任何误导性或不实信息。" +
                        "- 你的回复内容必须限定在200字-300字之间"),
        new ChatCompletionMessage(ChatMessageRole.USER.value(),
                stringBuilder.toString())
);
//返回AI结果

总结

Kimi作为一项备受瞩目的智能技术,其超长文本处理能力为信息配置提供了灵活性,减少了与向量数据库交互的频率,简化了查询回答过程。它在社交平台上广受关注,并在解决实际问题方面展现出巨大潜力。通过Kimi开放平台,我们可以了解其计费方式和API对接SDK,申请API密钥,并根据需求编写提示词。通过Java等语言集成API,实现项目需求。Kimi的出现,为我们提供了一种更便捷高效的信息获取方式,有助于解决工作中的挑战。

1、ollama到底是个什么玩意

一句话来说, Ollama 是一个基于 Go 语言开发的简单易用的本地大模型运行框架。可以将其类比为 docker(有类似docker中的一些常规命令list,pull,push,run 等等),事实上确实也制定了类似 docker 的一种模型应用标准,在后边的内容中,你能更加真切体会到这一点。

在管理模型的同时,它还基于 Go 语言中的 Web 框架 gin 提供了一些 Api 接口,让你能够像跟 OpenAI 提供的接口那样进行交互。

2、来看看ollama的几个命令

ollama 安装之后,其同时还是一个命令,与模型交互就是通过命令来进行的。

  • ollama list:显示模型列表
  • ollama show:显示模型的信息
  • ollama pull:拉取模型
  • ollama push:推送模型
  • ollama cp:拷贝一个模型
  • ollama rm:删除一个模型
  • ollama run:运行一个模型

通过在命令行运行 ollama即可查看到相关命令

89805f908c29784f7d7a0f9100c80a3

如果你用过 docker 的话,那简直就是so easy。
接下来我就在我的window、mac、以及小米手机上分别体验一下。

3、window上下载及体验

  • https://ollama.com/
    官网首页一进来就可以看到下载按钮,客户端可以在window、mac、linux等进行安装,跨平台的,真的nice啊。

并且上面已经把llama3集成进来了,这速度是真的快。
我这里下载的是window版本,目前213MB,很快就下载下来了。下载完毕即可安装

安装完毕之后你可以在命令行中输入查看版本

image

我们可以查看文档:
https://github.com/ollama/ollama/blob/main/README.md#quickstart

image

如上图所示,可以用最简单的方式就可以来启动llama3-8b,不过它可能还要等一会儿,因为模型大小有4.7G左右,需要下载一会儿哟。
甚至你的配置够高,也可以使用70b的模型来尝试,不过我的电脑配置一般估计跑起来太慢。
image
看这里下载速度还算可以,四分钟下载完毕,好了,那就先来测试一下吧。

动画
整个体验下来,这可能是我本机测试感觉速度上最快的离线大模型了,真的表现非常棒。按照目前应该很快会有优化版本出来的,到时候继续进行评测一下。

破除了之前有人说没有上下文的问题,中文语料可能确实有点少。但是写代码的体验还算不错的,虽然上面的代码可能是不对的。

image
上下文长度过长时确实有幻觉的问题。

这个回答速度真的再优化一下,很多小公司自己来部署大模型并进行创造就很近了。
但是它毕竟是小模型,参数相对较少,运行时所需要的资源就少很多。就像我本地运行的,其实我的电脑配置可以看一下如下图所示

image
从开发的角度来看还算不错了。另外对翻译的要求不高的话,效果也还过得去的。

同样的你也可以直接进行调用API

image

4、mac 上安装以及体验

同样还是在官网首页可以点击直接下载即可,下载下来会是一个压缩包

5038fd4c5fc4fe2ca719fd7f23078c7

解压然后安装就可以使用了,然后在命令行中可以查看是否安装成功

b7a6417698460d4d517478ffb0a6235

通过 ollama -v 来查看安装的版本,如果打印出来也就说明安装成功了
然后再通过 ollama serve 开启 ollama 的服务,注意当前这个命令行窗口暂时不要关闭,关闭了则代表 ollama 服务也暂时停止了,可以打开另外一个命令行窗口进行下载和使用大模型
同样的命令

4a985e90e1e5b3471aae674672f5d2c

哇塞,这会的下载速度简直起飞了
跑起来之后,测试就可以跟上面window类似了,这个就不在此多说了

5、小米手机再来体验一波

android手机要想体验一波,就需要先按照依稀Termux,这里我之前有写过一篇手
把手来教你在手机上安装大模型llama2
,这篇文章中我主要使用的是 huggingface 来运行大模型,那么现在用到的是ollama。

于是我在Termux中执行如下命令进行安装ollama
···
curl -fsSL
https://ollama.com/install.sh
| sh
···
发现我的手机没有root,ollama是使用不起来的,必须要先root。

简单搜索发现一个不错的方法:
https://gitlab.com/st42/termux-sudo

6ba6dbd6d9b597c744663c0b62ea92f

但是点进去发现是五年前的,不知道能不能用,于是我就又搜索了一下

https://github.com/termux/proot-distro

proot-distro 是一个用于在 Termux 应用程序中管理和使用 Linux 发行版的项目。Termux 是一个 Android 终端模拟器和 Linux 环境应用,它不需要设备的 root 权限就可以运行。
proot-distro 允许用户在 Termux 中安装、卸载和运行各种 Linux 发行版,包括 Ubuntu、Debian、Arch Linux 等。这样,用户就可以在他们的 Android 设备上使用完整的 Linux 环境,包括安装和运行 Linux 软件包。

接下来要先在手机上打开termux

// 先来安装proot-distro
pkg install proot-distro

//使用proot-distro安装一个debian
proot-distro install debian

// 安装成功后通过login命令就直接进入debian
proot-distro login debian

//进入之后再来安装ollama
curl -fsSL https://ollama.com/install.sh | sh

// 安装完毕可以查看ollama版本进行验证
ollama -v

// 出现版本号之后就可以使用ollama
// 开启ollama服务
ollama serve
// 此时这个命令行的窗口不要关闭,关闭之后ollama服务就停止了

然后再termux左上角向右滑动

23dec3e012ccd1b72faf78b4cdd3cd9

点击NEW SESSION,这样就新开了一个命令行,在这里命令行中就可以使用ollama其他命令了

// 这是一个新的命令行,,记得要先进入debian
proot-distro login debian

//下载并运行大模型
ollama run llama3

进行测试就跟上面一样了,这里相当于单独安装了一个模拟运行环境debian,会有一部分性能的消耗吧。有兴趣或者手机性能不错的到时候可以玩玩,感觉小模型在未来的某个时刻还是会有更广泛的应用场景,参数不用那么多,那么大,但是针对特定领域进行微调训练的。

6、总结

应该说llama3给与了开源模型更广阔的思考空间,期待开源模型更大的进步让我们拭目以待。同时希望Meta在接下来的时候能将llama3-400的发布。

就在实验此文章的过程中也发现了:

高通与Meta宣布合作,优化Meta新推出的Llama 3大语言模型在骁龙终端上的运行。Llama 3有两种版本,分别为80亿和700亿参数,旨在为智能手机、PC、VR/AR头显和汽车等设备提供强大的开源语言模型支持。合作将使开发者能够利用高通AI Hub的资源和工具,优化Llama 3在骁龙平台上的执行,以缩短产品上市时间,并提升终端侧AI的性能,包括响应能力、隐私性、可靠性和个性化体验。

这才几天过去,在
huggingface
平台就发现了8个中文微调模型,不得不说社区的力量真的太强大了,全民共享大模型。

f9038b109618b5dbb5bba41943c2318

从 Llama 3 的发布能看到,好而全的数据,对模型训练的重要性!
HuggingFaceFW 开源的 FineWeb
,有 15T tokens 的高质量网络数据,以英文为主,由 CommonCrawl 获取的 2013-2024 年数据。

image

ollama和huggingface 给与了像我这样的普通人,就能很方便的了解AI大模型,并且在本地运行大模型,真的太高兴了,接下来有机会会继续尝试其他的可能性。

写在开头

在过去的博文中我们学习了
ReentrantLock

synchronized
这两种Java并发使用频率最高的同步锁,在很多大厂面试题中有个经典考题:

ReentrantLock 与 synchronized异同点对比!

今天我们针对这一考题来做一个尽可能全面的总结哈。

ReentrantLock 与 synchronized

ReentrantLock是一种独占式的可重入锁,位于java.util.concurrent.locks中,是Lock接口的默认实现类,底部的同步特性基于AQS实现,和synchronized关键字类似,但更灵活、功能更强大、也是目前实战中使用频率非常高的同步类。

synchronized 依赖于 JVM 而 ReentrantLock 依赖于 API

synchronized
是依赖于 JVM 实现的,虚拟机团队在 JDK1.6 为 synchronized 关键字进行了很多优化,但是这些优化都是在虚拟机层面实现的,并没有直接暴露给我们。

ReentrantLock
是 JDK 层面实现的(也就是 API 层面,需要 lock() 和 unlock() 方法配合 try/finally 语句块来完成),ReentrantLock 比 synchronized 增加了一些高级功能。

区别罗列

  1. ReentrantLock 是一个类,而 synchronized 是 Java 中的关键字;
  2. ReentrantLock 必须手动释放锁。通常需要在 finally 块中调用 unlock 方法以确保锁被正确释放;
  3. ReentrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁;
  4. synchronized 会自动释放锁,当同步块执行完毕时,由 JVM 自动释放,不需要手动操作;
  5. ReentrantLock 可以实现多路选择通知(可以绑定多个 Condition),而 synchronized 只能通过 wait 和 notify/notifyAll 方法唤醒一个线程或者唤醒全部线程(单路通知);
  6. ReentrantLock提供了一种能够中断等待锁的线程的机制,通过 lock.lockInterruptibly() 来实现这个机制。也就是说正在等待的线程可以选择放弃等待,改为处理其他事情。而synchronized不具备这种特点。
  7. ReentrantLock: 通常提供更好的性能,特别是在高竞争环境下;
  8. synchronized: 在某些情况下,性能可能稍差一些,但随着 JDK 版本的升级,性能差距已经不大了。

【注】:
Condition是 JDK1.5 之后才有的,它具有很好的灵活性,比如可以实现多路通知功能也就是在一个Lock对象中可以创建多个Condition实例(即对象监视器),线程对象可以注册在指定的Condition中,从而可以有选择性的进行线程通知,在调度线程上更加灵活,我们在后面的学习中会耽误聊一聊它!

性能对比

虽然说JDK1.6后synchronized的性能有很大的提升了,但是相比较而言,两者之间仍然存在性能差别,我们通过一个小demo来测试一下。

public class Test {

    private static final int NUM_THREADS = 10;
    private static final int NUM_INCREMENTS = 1000000;

    private int count1 = 0;
    private int count2 = 0;

    private final ReentrantLock lock = new ReentrantLock();
    private final Object syncLock = new Object();

    public void increment1() {
        lock.lock();
        try {
            count1++;
        } finally {
            lock.unlock();
        }
    }

    public void increment2() {
        synchronized (syncLock) {
            count2++;
        }
    }

    public static void main(String[] args) throws InterruptedException {

        Test test = new Test();

        // ReentrantLock性能测试
        long startTime = System.nanoTime();
        Thread[] threads = new Thread[NUM_THREADS];
        for (int i = 0; i < NUM_THREADS; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < NUM_INCREMENTS; j++) {
                    test.increment1();
                }
            });
            threads[i].start();
        }
        for (Thread thread : threads) {
            thread.join();
        }
        long endTime = System.nanoTime();
        System.out.println("ReentrantLock完成时间: " + (endTime - startTime) + " ns");

        // synchronized性能测试
        startTime = System.nanoTime();
        for (int i = 0; i < NUM_THREADS; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < NUM_INCREMENTS; j++) {
                    test.increment2();
                }
            });
            threads[i].start();
        }
        for (Thread thread : threads) {
            thread.join();
        }
        endTime = System.nanoTime();
        System.out.println("synchronized完成时间: " + (endTime - startTime) + " ns");
    }
}

我们采用10个线程,每个线程做加1000000操作,执行时间对比如下:

//1000000万数据量时
ReentrantLock完成时间: 272427700 ns
synchronized完成时间: 675759100 ns
//10000数据量时
ReentrantLock完成时间: 52207600 ns
synchronized完成时间: 11291600 ns

很明显在数据量比较大的时候,竞争激烈时,ReentrantLock的性能要比synchronized好很多,但在数据量较低的情况下,会呈现出不同的结果。

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得
留言+点赞+收藏
呀。原创不易,转载请联系Build哥!

image

如果您想与Build哥的关系更近一步,还可以关注“JavaBuild888”,在这里除了看到《Java成长计划》系列博文,还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等等,欢迎您的加入!

image

从此博文开始分几篇介绍C#的开发。这次讲讲C#的.net framework的Dll文件类库模块的编程方法。

对于Windows来说,要运行应用程序要基于Dll类库和Exe执行文件。对于笔者来说,模块化的编程方式,就是将一些函数等封装到Dll类库文件中,将这些类库集中和分模块进行编写和管理。就是将应用需要的这些函数从大到小,按照模块化的规则去进行编写,这样在应用开发的时候能够进行分工,便于测试和应用的分发。

到了现在这种编程语言,对于类的概念已经很清晰明了了。C#借鉴了Java的语法,对于面向对象编程,封装、继承、多态的方式也很清晰。反观以前的VB6和VC++的对象,今天在群里与群友讨论C#调用其它编程语言的Dll,在VC++的应用里能够New一个C#的类为对象,并使用其属性和方法,但是在C#里目前没找到New一个VB6和VC++的类为对象的方法,笔者认为只能通过函数的方式去对VC++的类里的变量进行赋值来当做属性的赋值了。

上面说了这么多,下面开始这篇博文的内容吧。

一、
打开Visual Studio 2022;

首先必须先安装了VS 2022,具体见系列上一篇博文:
https://www.cnblogs.com/lzhdim/p/18100292

打开了欢迎窗体,这里能够
在窗体上鼠标左键按下并滑动来移动该窗体

彩蛋
)。

如果是第一次打开,直接点下一步;否则到达下面这个窗体。左侧是打开过的项目列表;右侧是操作菜单。点击“创建新项目”。

下面这个窗体,选择右上角的“所有设置”,中间选“所有平台”,右边选“其它”。下面会显示“空白解决方案”。

选中“空白解决方案”,点“下一步”。这里输入解决方案名称,一般是该项目软件的名称,这里的例子是:CSharpDll,点下面的右侧的省略号,选择保存位置,这里是桌面。

点右下角的“创建”,打开了VS 2022的界面。

点击VS 2022的“视图”菜单,点击“属性窗口”和“工具箱”以及“类视图”,将显示这些窗口,然后将这3个窗口拖动顶部的标题栏,将其固定到VS 2022界面的左侧(这个根据个人的喜好放置位置,笔者推荐这个布局)。拖到左侧会显示放置位置(那个位置箭头),将这3个窗口放在同一个布局里。

放置在同一侧,将在底部显示这3个窗口的标题,见下图底部。

放置好窗口后,在界面右侧是“解决方案资源管理器”,点击该标题能够修改解决方案名称,或者在左侧的属性窗口进行更改名称。

这里建议创建下列目录进行存放项目的文件:

1) 新建CSharpDll目录,创建3个子目录;(在此博文的最后将保存此博文记录的内容,直接将这几个目录复制过去即可)。

2) ProjectResource目录放置项目需要的资源文件;

3) 将解决方案文件放到Src目录里;

建议将这几个目录另外存放,以后有新项目的时候直接复制该目录到新解决方案即可,节省时间。