我有一个简单的任务:
有没有可能写一个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:它确实有效!你甚至可以控制编组类型,不可信!
我有一些低级别的图像/纹理操作,其中32位颜色存储为UInt32或int,我需要在两者之间进行非常快速的按位转换.
例如
int color = -2451337;
//exception
UInt32 cu = (UInt32)color;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
感谢致敬
我想将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)
在这种情况下它应该没有问题,因为指针仍然是固定的,但上面的正常数组的问题仍然存在.
在我的转换方法中,当我使用时,我得到了错误的数字分隔符,TypeConverter.ConvertToString(Object)因为我的系统是德语.此方法还有另一个重载,如下所示:TypeConverter.ConvertToString(ITypeDescriptorContext, CultureInfo, Object).
除了在之前和之后切换文化之外,是否有一种聪明的方法可以获得ITypeDescriptorContext调用此方法的其他选项InvariantCulture?
当我登录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) 在 .NET 472 的新 .NET SDK 样式项目格式中创建“Windows 应用程序”项目时,项目属性中没有“发布”部分来配置 ClickOnce 部署。
是否有任何解决方案/解决方法可以将 ClickOnce 与新项目格式一起使用?
我的问题很简单:
我们的C#应用程序具有一个带有菜单的MainForm,以及与菜单项相关的几个键盘快捷键。
现在,我们也需要从某些子窗体中触发菜单项。但是由于在子窗体之一处于活动状态时MainForm处于非活动状态,因此快捷方式不起作用。
是否有一种简单的方法可以将所有键盘事件从子窗体传播到“所有者”窗体?还是只是一般的另一种形式?
嗯,我们不能使用一些低级的Windows东西,因为我们也需要在Mono / Linux上运行该应用程序。
编辑:我有确切的问题是使用另一种形式的相同快捷方式触发菜单项。当然,如果添加了新项目的菜单更改,则无需更新表单中的代码。
如何在 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。有任何想法吗?
我现在已经阅读了很多关于按键事件的文章,但我不知道如何获得它们。我知道只有具有键盘焦点的当前控件才能获取新闻事件。但是我如何确保我的用户控件拥有它?
没有运气就试过这个:
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 事件,因为无论哪种语言,它都会在每个键盘上发送正确的字符。这对于文字写作很重要。如果您只获得单个密钥,则必须自己将它们处理成正确的字符。但也许有一种方便的方法可以将按下的键转换为本地化字符?
我们的任务非常简单,我们有一个对象图,其中每个对象(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