小编tha*_*alm的帖子

如何在Delphi中使用.Net程序集而无需在GAC或COM中注册?

我有一个简单的任务:

有没有可能写一个Delphi DLL并放一个.Net程序集(只有一个接口有4个方法和一个实现接口的类)除了它并从Delphi DLL调用它?

我的意思是,如果我为tlb创建一个tlb和一个delphi单元,而不注册Assembly/tlb,我可以直接从.Net程序集导入.Net类型(相对文件名)吗?

最好的,thalm

编辑(我找到了):

大多数解决方案必须为COM注册至少一个dll/tlb.但我发现最有希望的事情是:来自Robert Giesecke的Unmanaged Exports,它是一个Visual Studio项目模板,它允许你编写静态C#(或任何.Net语言)方法,并从任何非托管语言调用它们,真棒:

class Test
{
    [DllExport("add", CallingConvention = CallingConvention.StdCall)]
    public static int Add(int left, int right)
    {
        return left + right;
    } 
}
Run Code Online (Sandbox Code Playgroud)

编辑2:它确实有效!你甚至可以控制编组类型,不可信!

.net delphi dll interop native

15
推荐指数
1
解决办法
5779
查看次数

按位运行int到UInt32的最快方法?

我有一些低级别的图像/纹理操作,其中32位颜色存储为UInt32或int,我需要在两者之间进行非常快速的按位转换.

例如

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

感谢致敬

c# casting copy uint32

8
推荐指数
2
解决办法
5455
查看次数

传递一个float []作为ref浮动到非托管代码是一个好主意?

我想将float []传递给C方法.C签名如下:

EXTERN int process_raw(float *inBuffer, float *outBuffer);
Run Code Online (Sandbox Code Playgroud)

在C#中,签名是:

public static extern int process_raw(ref float inBuffer, ref float outBuffer);
Run Code Online (Sandbox Code Playgroud)

将带有ref的数组传递给第一个成员会有问题吗:

process_raw(ref someArray[0], ref anotherArray[0])
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:当然重要的是要知道C代码对浮点数的作用:它将它们视为数组,并将从inBuffer读取值并将值写入outBuffer.如下所述,问题是在PInvoke调用期间是否会固定整个内存?

编辑2:另一个评论.我故意选择ref float因为我也想做以下事情:

fixed(byte* outBuff = buffer)
{
    Process(ticks, ref aFloat, ref ((float*)outBuff)[0]);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下它应该没有问题,因为指针仍然是固定的,但上面的正常数组的问题仍然存在.

c c# arrays marshalling

7
推荐指数
1
解决办法
2996
查看次数

如何调用TypeConverter.ConvertTo或ConvertToString与InvariantCulture的,但没有实施ITypeDescriptorContext

在我的转换方法中,当我使用时,我得到了错误的数字分隔符,TypeConverter.ConvertToString(Object)因为我的系统是德语.此方法还有另一个重载,如下所示:TypeConverter.ConvertToString(ITypeDescriptorContext, CultureInfo, Object).

除了在之前和之后切换文化之外,是否有一种聪明的方法可以获得ITypeDescriptorContext调用此方法的其他选项InvariantCulture

.net c# localization tostring

7
推荐指数
1
解决办法
2976
查看次数

Cygwin'cd'命令总是告诉我"没有这样的文件或目录"

当我登录cygwin终端并输入:

cd "cygdrive/c/existing/path"
Run Code Online (Sandbox Code Playgroud)

它告诉我,"没有这样的文件或目录".我确信这条路存在......我是否会错过一个特殊的cygwin包,或者我有错误的配置?我很困惑......

当我尝试从Windows批处理文件调用cygwin bash时,它的行为相同.我基本上想要做的是创建一个Windows批处理文件,它启动cygwin并执行一个带有指定工作目录的shell脚本,如本博客文章所述:http://blog.dotsmart.net/2011/01/27/executing -cygwin-的bash的脚本式窗口/

我的批处理文件似乎工作,它执行以下命令:

%_CYGBIN%\bash.exe --login "cd %_CYGPATH%" "./%_CYGSCRIPT%"
Run Code Online (Sandbox Code Playgroud)

但是cygwin不会执行'cd'命令.我的批处理文件的控制台输出是:

/usr/bin/bash: cd /cygdrive/c/existing/path: No such file or directory
Run Code Online (Sandbox Code Playgroud)

bash cygwin cd path

6
推荐指数
1
解决办法
1万
查看次数

如何将 ClickOnce 与新的 SDK 样式 .csproj 项目格式一起使用?

在 .NET 472 的新 .NET SDK 样式项目格式中创建“Windows 应用程序”项目时,项目属性中没有“发布”部分来配置 ClickOnce 部署。

项目属性

是否有任何解决方案/解决方法可以将 ClickOnce 与新项目格式一起使用?

.net c# deployment csproj

6
推荐指数
0
解决办法
410
查看次数

将键盘事件从一种形式发送到另一种形式

我的问题很简单:

我们的C#应用​​程序具有一个带有菜单的MainForm,以及与菜单项相关的几个键盘快捷键。

现在,我们也需要从某些子窗体中触发菜单项。但是由于在子窗体之一处于活动状态时MainForm处于非活动状态,因此快捷方式不起作用。

是否有一种简单的方法可以将所有键盘事件从子窗体传播到“所有者”窗体?还是只是一般的另一种形式?

嗯,我们不能使用一些低级的Windows东西,因为我们也需要在Mono / Linux上运行该应用程序。

编辑:我有确切的问题是使用另一种形式的相同快捷方式触发菜单项。当然,如果添加了新项目的菜单更改,则无需更新表单中的代码。

c# forms keyboard mono events

5
推荐指数
1
解决办法
4277
查看次数

如何通过 3 个点计算循环弧并在 3d 中将其参数化为 0..1

如何在 3d 中计算通过 3 个点 A、B、C 的弧。从 A 到 C 通过 B(处理顺序)。

大多数机器人手臂都有这种移动命令。我需要模拟它并对它应用不同的速度动态,因此需要一个参数 0..1 将位置从 A 移动到 C。

编辑:

我所拥有的是圆弧的半径和中心,但是如果我知道开始和结束角度,我如何在 3d 中参数化圆?

编辑2:

越来越近。如果我在圆所在的平面上有两个单位长度的垂直向量 v1 和 v2,我可以进行如下参数化:x (t) = c + r * cos(t) * v1 + r * sin(t) * v2

所以我取v1 = ac,我现在只需要找到v2。有任何想法吗?

c# math robotics

5
推荐指数
1
解决办法
3048
查看次数

如何在 C# 中将所有 KeyPress 事件作为 UserControl 获取?

我现在已经阅读了很多关于按键事件的文章,但我不知道如何获得它们。我知道只有具有键盘焦点的当前控件才能获取新闻事件。但是我如何确保我的用户控件拥有它?

没有运气就试过这个:

public partial class Editor : UserControl

this.SetStyle(ControlStyles.Selectable, true);
this.TabStop = true;
...
//take focus on click
protected override void OnMouseDown(MouseEventArgs e)
{
    this.Focus();
    base.OnMouseDown(e);
}
...
protected override bool IsInputKey(Keys keyData)
{
   return true;
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

//register global keyboard event handlers
private void Editor_ParentChanged(object sender, EventArgs e)
{
    if (TopLevelControl is Form)
    {
        (TopLevelControl as Form).KeyPreview = true;
        TopLevelControl.KeyDown += FCanvas_KeyDown;
        TopLevelControl.KeyUp += FCanvas_KeyUp;
        TopLevelControl.KeyPress += FCanvas_KeyPress;
    }
}
Run Code Online (Sandbox Code Playgroud)

后者给了我按下和按下键的事件,但仍然没有按键。当我的控件从 UserControl 继承时,是否有任何其他方法可以用来获取每个向下/向上/按下事件?

编辑:因为有一条评论链接了另一个 SO 问题:重要的是我还获得了 KeyPress 事件,因为无论哪种语言,它都会在每个键盘上发送正确的字符。这对于文字写作很重要。如果您只获得单个密钥,则必须自己将它们处理成正确的字符。但也许有一种方便的方法可以将按下的键转换为本地化字符?

.net c# keyboard winforms

5
推荐指数
1
解决办法
8471
查看次数

ISerializable:在反序列化时分配现有对象

我们的任务非常简单,我们有一个对象图,其中每个对象(IDItem)都有一个唯一的ID.对象图在客户端和服务器计算机上存在两次.

现在我们将一些可序列化的命令传递给服务器.该命令具有一些IDItem作为字段.IDItems实现ISerializable接口,只将它们的ID存储在SerializationInfo中.喜欢:

// The method called when serializing a IDItem.
void GetObjectData(SerializationInfo info, StreamingContext context)
{
    // Instead of serializing this object, just save the ID
    info.AddValue("ID", this.GetID());
}
Run Code Online (Sandbox Code Playgroud)

问题是,我们如何将现有对象分配给反序列化器创建的实例?显然,ISerializable构造函数中的以下内容不起作用,因为'this'标识符是只读的:

//does not work   
protected IDItem(SerializationInfo info, StreamingContext context)
{
    this = GlobalObject.GetIDItem(info.GetString("ID"));
}
Run Code Online (Sandbox Code Playgroud)

那么任何想法我们如何将现有对象分配给反序列化对象?

最诚挚的问候,thalm

c# serialization iserializable

4
推荐指数
1
解决办法
981
查看次数